版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wdx_1136346879/article/details/86527385
11.新版本的检测与更新
#获取版本号# ****
id : 驼峰式命名 : 控件的类型_控件所在位置_控件所表示的逻辑内容
/**
* 获取应用程序的版本号
* @return
*/
public String getVersionName(){
//1.包的管理者,获取应用程序中清单文件中信息
PackageManager packageManager = getPackageManager();
try {
//2.根据包名获取应用程序相关信息
//packageName : 应用程序的包名
//flags : 指定信息的标签,指定了标签就会获取相应标签对应的相关信息
//PackageManager.GET_ACTIVITIES : 获取跟activity相关的信息
//getPackageName() : 获取应用程序的包名
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(),0);
//3.获取应用程序版本号名称
String versionName = packageInfo.versionName;
return versionName;
} catch (NameNotFoundException e) {
//找不到包名的异常
e.printStackTrace();
return null;
}
}
#连接服务器# ****
/**
* 更新版本
*/
private void update() {
//连接服务,联网,耗时操作,4.0不允许在主线程中执行耗时操作
new Thread(){
public void run() {
//1.连接服务器
try {
//1.1获取连接地址
URL url = new URL("xxxxxx");
//1.2获取连接的操作
HttpURLConnection conn = (HttpURLConnection) url.openConnection();//http://协议
//1.3设置超时时间
conn.setConnectTimeout(5000);//连接超时时间
//conn.setReadTimeout(5000);//读取超时时间
//1.4设置请求方式
conn.setRequestMethod("GET");//post
//1.5获取服务器返回的状态码 200 404 500
int responseCode = conn.getResponseCode();
if (responseCode == 200) {
//连接成功
}else{
//连接失败
}
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
};
}.start();
}
#数据封装形式# ****
updateinfo.html apk文件存放到apache-tomcat-6.0.35-windows-x86\apache-tomcat-6.0.35\webapps\ROOT
json : {"code":"2.0","apkurl":"xxxxxxxx","des":"新版本上线了,快来下载吧!!!!"}
code :接口
注意保存的格式:utf-8无bom格式 notepad++ ; editplus : utf-8(选择) utf-8+bom
#获取服务器返回的数据# ****
//2.连接成功,获取服务返回的数据 1.code : 新版本的版本号 2.apkurl : 新版本的下载地址 3.des : 描述信息
//2.1.服务器是如何封装数据 xml json : 返回就是一个json串
System.out.println("连接成功.....");
//2.2.获取服务器返回的数据,流信息
InputStream inputStream = conn.getInputStream();
//2.3.将流信息转化成字符串
String json = StreamUtils.parserStream(inputStream);
//2.4.解析数据
JSONObject jsonObject = new JSONObject(json);
//2.5.获取数据
code = jsonObject.getString("code");
apkurl = jsonObject.getString("apkurl");
des = jsonObject.getString("des");
工具类
/**
* 将流信息转化成字符串
* @param in
* @return
* @throws IOException
*/
public static String parserStream(InputStream in) throws IOException{
//字符流
BufferedReader br = new BufferedReader(new InputStreamReader(in));
//写入流
StringWriter sw = new StringWriter();
//读写操作,数据缓冲区
String str = null;
while((str = br.readLine()) != null){
//写入操作
sw.write(str);
}
//关流
sw.close();
br.close();
return sw.toString();
}
#查看是否有最新版本,弹出对话框提醒用户更新版本# ****
1.查看是否有最新版本,在update方法
//3.查看是否有最新版本
//3.1.判断服务返回code值和我们当前应用程序的版本号是否一致
if (code.equals(getVersionName())) {
//不升级
}else{
//升级
//3.2.弹出对话框
message.what = MSG_UPDATE_DIALOG;
}
在finally给handler发送消息
finally{//不管有没有异常,都会执行
handler.sendMessage(message);
}
2.在handler中接受信息做出判断
private Handler handler = new Handler(){
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_UPDATE_DIALOG:
//弹出对话框
showUpdateDialog();
break;
}
}
};
3.弹出对话框
/**
* 3.3.弹出对话框
*/
protected void showUpdateDialog() {
AlertDialog.Builder builder = new Builder(this);
//设置标题
builder.setTitle("新版本:"+code);
//设置图标
builder.setIcon(R.drawable.ic_launcher);
//设置描述信息
builder.setMessage(des);
//设置升级按钮
builder.setPositiveButton("升级", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//设置取消按钮
builder.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
//显示对话框
// builder.create().show();效果一致
builder.show();
}
#下载最新版本# ****
/**
* 4.下载最先版本
*/
protected void download() {
HttpUtils httpUtils = new HttpUtils();
//4.1.判断SD卡是否挂载
if (Environment.getExternalStorageState().equals(Environment.MEDIA_MOUNTED)) {
//4.2.下载
//url : 新版本的下载地址
//target : 保存下载文件的路径
//callback:回调监听RequestCallBack
httpUtils.download(apkurl, "/mnt/sdcard/mobilesafexian2.0.apk", new RequestCallBack<File>() {
//下载成功的调用
@Override
public void onSuccess(ResponseInfo<File> arg0) {
}
//下载失败的调用
@Override
public void onFailure(HttpException arg0, String arg1) {
}
//4.2.1显示当前的下载进度
//total : 总进度
//current : 当前的进度
//isUploading : 是否支持断点续传
@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);// 132/520
}
});
}
}
#安装最新版本# ****
/**
* 5.安装最新的版本
*/
protected void install() {
/**
* <intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="content" />// content://
<data android:scheme="file" />// 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");
//setData和setType是相互冲突的,两个数据是会相互覆盖的
// intent.setType("application/vnd.android.package-archive");
// intent.setData(Uri.fromFile(new File("/mnt/sdcard/mobilesafexian2.0.apk")));
intent.setDataAndType(Uri.fromFile(new File("/mnt/sdcard/mobilesafexian2.0.apk")), "application/vnd.android.package-archive");
//在当前的activity退出的时候,会调用之前activity的OnActivityResult方法
//requestCode : 请求码,表示activity去打开新的activity的时候在新的activity中标示
// a b c 现在a -> c b-> c ,在c中我们是要确定那个a的intent那个是b的intent
//在这里我们用不到 所以0
startActivityForResult(intent, 0);
}
重写OnActivityResult方法
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
enterHome();
}