Android App升级流程
本文对Android App升级流程做了部分概要,讲解了怎样获取本地App版本号及获取网络App版本号,获取之后的部分操作。
升级流程图
代码部分
获取本地版本app名:
private String getVersionName(){
//包管理器
PackageManager packageManager = getPackageManager();
try {
//获取包的信息
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
String versionName = packageInfo.versionName;//版本名
System.out.println("versionName="+versionName);
return versionName;
} catch (NameNotFoundException e) {//没有找到包名的时候会走此异常
e.printStackTrace();
}
return "";
}
获取本地app版本号:
private int getVersionCode(){
//包管理器
PackageManager packageManager = getPackageManager();
try {
//获取包的信息
PackageInfo packageInfo = packageManager.getPackageInfo(getPackageName(), 0);
int versionCode = packageInfo.versionCode;//版本号
System.out.println("versionCode="+versionCode);
return versionCode;
} catch (NameNotFoundException e) {//没有找到包名的时候会走此异常
e.printStackTrace();
}
return -1;
}
从服务器获取版本进行校验:因为需要连网获取版本信息,所以必须启动子线程,否则主线程超过5秒会堵塞并导致程序崩溃。
private void checkVersion(){
//启动子线程一部加载数据
new Thread(){
@Override
public void run() {
HttpURLConnection conn=null;
URL url=new URL(服务器地址);
conn=(HttpURLConnection) url.openConnection();
conn.setRequestMethod("GET");//设置请求方式
conn.setConnectTimeout(5000);//设置链接超时
conn.setReadTimeout(5000);//设置响应超时,连接上了,但服务器迟迟不给响应
conn.connect();//链接服务器
int responseCode = conn.getResponseCode();//获取响应码
if(responseCode==200){
InputStream inputStream = conn.getInputStream();
String result = StreamUtils.readFromStream(inputStream);
System.out.println("网络返回结果:"+result);
借助一个工具类(StreamUtils)将返回的结果转换成json格式的数据,代码如下:
public class StreamUtils {
/**将输入流读取成String返回
* @throws IOException */
public static String readFromStream(InputStream in) throws IOException{
ByteArrayOutputStream out=new ByteArrayOutputStream();
int len=0;
byte[] buffer=new byte[1024];
while((len=in.read(buffer))!=-1){
out.write(buffer, 0, len);
}
String result=out.toString();
in.close();
out.close();
return result;
}
}
接下来解析json字符串,拿到我们想要的版本号跟版本名:
//解析json
JSONObject jo=new JSONObject(result);
mVersionName = jo.getString("versionName");
mVersionCode = jo.getInt("versionCode");
接下下判断是否有更新:
if(mVersionCode>getVersionCode()){//判断是否有更新
//如果服务器的versionCode大于本地的versionCode,说明有更新
//弹出升级对话框
}
对话框内容:
protected void showUpdateFialog() {
AlertDialog.Builder builder=new AlertDialog.Builder(this);
builder.setTitle("最新版本:"+mVersionName);
builder.setPositiveButton("立即更新", new OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
System.out.println("立即更新");
}
});
builder.setNegativeButton("以后再说", null);
builder.create().show();
}
此部分有异常产生,请自行处理。
签名冲突将在下一篇中继续讲解。