爱玺玺

爱玺玺的生活日记本。wx:lb87626

android检测安装升级版本,splash显示2秒

package cn.jianhaozhan.activity;


import java.io.File;

import java.io.IOException;

import java.io.InputStream;

import java.net.HttpURLConnection;

import java.net.MalformedURLException;

import java.net.URL;

import java.net.URLConnection;


import org.json.JSONException;

import org.json.JSONObject;


import com.lidroid.xutils.HttpUtils;

import com.lidroid.xutils.exception.HttpException;

import com.lidroid.xutils.http.ResponseInfo;

import com.lidroid.xutils.http.callback.RequestCallBack;


import cn.jianhaozhan.utils.StreamUtil;


import android.support.v7.app.ActionBarActivity;

import android.app.AlertDialog;

import android.app.AlertDialog.Builder;

import android.content.DialogInterface;

import android.content.DialogInterface.OnClickListener;

import android.content.Intent;

import android.content.pm.PackageInfo;

import android.content.pm.PackageManager;

import android.content.pm.PackageManager.NameNotFoundException;

import android.net.Uri;

import android.os.Bundle;

import android.os.Environment;

import android.os.Handler;

import android.os.Message;

import android.os.SystemClock;

import android.util.Xml;

import android.view.Menu;

import android.view.MenuItem;

import android.view.View;

import android.widget.TextView;

import android.widget.Toast;


public class SplashActivity extends ActionBarActivity {

private String code;

private String apkurl;

private String des;

private TextView tv_spalsh_plan;

protected static final int MSG_ENTER_HOME = 0;

protected static final int MSG_UPDATE_DIALOG = 1;

protected static final int MSG_URL_ERROR = 2;

private Handler handler = new Handler() {

@Override

public void handleMessage(Message msg) {

switch (msg.what) {

// 有新版本弹窗更新对话框

case MSG_UPDATE_DIALOG:

showdialog();

break;


case MSG_ENTER_HOME:

enterHome();

break;

case MSG_URL_ERROR:

Toast.makeText(getApplicationContext(), "错误号" + MSG_URL_ERROR,

0).show();

break;

}

super.handleMessage(msg);

}

};

private TextView tv_spalsh_versionname;


@Override

protected void onCreate(Bundle savedInstanceState) {

super.onCreate(savedInstanceState);

setContentView(R.layout.activity_splash);

tv_spalsh_versionname = (TextView) findViewById(R.id.tv_spalsh_versionname);

tv_spalsh_plan = (TextView) findViewById(R.id.tv_spalsh_plan);

tv_spalsh_versionname.setText("版本号:" + getVersionName());

update();

}


/**

* 弹窗对话框

*/

protected void showdialog() {

AlertDialog.Builder builder = new Builder(this);

// 设置对话框不能消息

builder.setCancelable(false);

// 设置对话框标题

builder.setTitle("新版本" + code);

// 设置对话框图标

builder.setIcon(R.drawable.ic_launcher);

// 设置对话框描述

builder.setMessage(des);

// 设置升级/取消按钮

builder.setPositiveButton("升级", new OnClickListener() {


@Override

public void onClick(DialogInterface dialog, int which) {

download();

}

});

builder.setNegativeButton("取消", new OnClickListener() {


@Override

public void onClick(DialogInterface dialog, int which) {

dialog.dismiss();

enterHome();

}

});

// 显示对话框,不要忘记

builder.show();

}


/**

* 下载新版本

*/

protected void download() {

HttpUtils httpUtils = new HttpUtils();

// 判断SD卡是否挂载

if (Environment.getExternalStorageState().equals(

Environment.MEDIA_MOUNTED)) {

// 第一个参数下载地址,第二个下载到本地的路径,第三个参数回掉函数

httpUtils.download(apkurl, "/mnt/sdcard/mobile.apk",

new RequestCallBack<File>() {


@Override

public void onSuccess(ResponseInfo<File> arg0) {

// 下载成功

System.out.println(apkurl);

// 按照最新版本

installAPK();

}


@Override

public void onFailure(HttpException arg0, String arg1) {

// TODO Auto-generated method stub


}


@Override

public void onLoading(long total, long current,

boolean isUploading) {

super.onLoading(total, current, isUploading);

// 显示下载进度

tv_spalsh_plan.setVisibility(View.VISIBLE);

tv_spalsh_plan.setText(current + "/" + total);

}


});

}

}


/**

* 安装新版本

*/

protected void installAPK() {

/**

* <intent-filter> <action android:name="android.intent.action.VIEW" />

* <category android:name="android.intent.category.DEFAULT" /> <data

* android:scheme="content" /> //content : 从内容提供者中获取数据 content:// <data

* android:scheme="file" /> // file : 从文件中获取数据 <data

* android:mimeType="application/vnd.android.package-archive" />

* </intent-filter>

*/

Intent intent = new Intent();

intent.setAction("android.intent.action.VIEW");

intent.addCategory("android.intent.category.DEFAULT");

intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/mobile.apk")),

"application/vnd.android.package-archive");

// 退出升级安装程序直接进入主页面

// 0是请求码,这个请求码发送给重写的onActivityResult,这个函数根据这个请求码做不同的处理。请求码类似get参数

startActivityForResult(intent, 0);// 这里需要重写onActivityResult

}


@Override

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

enterHome();

}


/**

* 进入主界面

*/

protected void enterHome() {

Intent intent = new Intent(this, HomeActivity.class);

startActivity(intent);

// 移除界面

finish();

}


/**

* 获取当前应用版本号

* @return

*/

private String getVersionName() {

// 包管理者

PackageManager pm = getPackageManager();

// packageName 应用程序包名

// flags 执行信息的标签,0:获取基础信息,包名,版本号,要获取的权限

try {

// pm.getPackageInfo("cn.jianhaozhan.activity", 0);

// getPackageName获取包名

// info命名的其实就是个javabean

PackageInfo packageInfo = pm.getPackageInfo(getPackageName(), 0);

// 获取版本号

String versionName = packageInfo.versionName;

return versionName;

} catch (NameNotFoundException e) {

// TODO Auto-generated catch block

e.printStackTrace();

}

return null;

}


/**

* 提醒用户版本更新

*/

private void update() {

new Thread() {


public void run() {

Message message = Message.obtain();

// 获取连接服务器的开始时间

int startTime = (int) System.currentTimeMillis();

// 1.1连接服务器

try {

// 1.1.1 连接路径

URL url = new URL("http://jianhaozhan.cn/updateinfo.html");

// 1.1.2获得连接对象

HttpURLConnection conn = (HttpURLConnection) url

.openConnection();

// 1.1.2设置超时时间

conn.setConnectTimeout(5000);

conn.setReadTimeout(5000);

// 设置请求方式

conn.setRequestMethod("GET");

// 获取状态码

int responseCode = conn.getResponseCode();

if (responseCode == 200) {

// 连接成功,获取服务器返回的数据code:新版本的版本号,新版本的下载路径,告诉用户增加了哪些功能

System.out.println("连接成功");

// 获取服务器返回的数据,得到服务器返回的流信息

InputStream inputStream = conn.getInputStream();

// 将服务器返回的流信息转换成字符串

String json = StreamUtil.parseStremUitl(inputStream);

// 解析json数据

JSONObject jsonObject = new JSONObject(json);

code = jsonObject.getString("code");

apkurl = jsonObject.getString("apkurl");

des = jsonObject.getString("des");

System.out.println(code + " " + apkurl + " " + des);

// 查看是否有最新版本

if (code.equals(getVersionName())) {

message.what = MSG_ENTER_HOME;

} else {

message.what = MSG_UPDATE_DIALOG;

}

} else {

System.out.println("连接失败");

message.what = MSG_URL_ERROR;

}

} catch (MalformedURLException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (IOException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} catch (JSONException e) {

// TODO Auto-generated catch block

e.printStackTrace();

} finally {

// 获取连接服务器成功的时间

int endTime = (int) System.currentTimeMillis();

// 算出连接服务器一共用了多少时间,因为有时候检测更新网络连接超过两秒

int dTime = endTime - startTime;

// 开始的splash广告画面需要显示两秒

// 连接服务器时间小于2秒睡,大于2秒不睡。

if (dTime < 2000) {

// 睡2秒

SystemClock.sleep(2000 - dTime);// 始终都是睡两秒钟的时间

}

handler.sendMessage(message);

}

}

}.start();

}

}


发表评论:

Powered By Z-BlogPHP 1.4 Deeplue Build 150101

Copyright Your WebSite.Some Rights Reserved.

蜀ICP备11021721号-5