下面会通过代码和解说的方式简单去实现
- 首先上方用到一个handler 去实现吐丝
Handler handler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case 0:
Toast.makeText(MainActivity.this, "版本号相同无需升级!", 0).show();
break;
case 1:
// 升级的弹框
showUpdataDialog();
Toast.makeText(MainActivity.this, "版本号不同需要升级!", 0).show();
break;
case 2:
break;
default:
break;
}
};
};
- 在onCreate方法中的调用
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//初始化控件
TextView tvname = (TextView) findViewById(R.id.tv_main_pagename);
//检测是否获取到当前的版本号
String versionName = getVersionName();
tvname.setText("当前版本号:" + versionName);
}
- 获取本机的版本信息
private String getVersionName() {
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = null;
try {
// 获取packagemanager的实例
PackageManager packageManager = this.getPackageManager();
packInfo = packageManager.getPackageInfo(this.getPackageName(), 0);
} catch (Exception e) {
e.printStackTrace();
}
return packInfo.versionName;
}
- 通过通过一个按钮的点击事件去实现版本更新的操作
// 版本更行的点击事件
public void versions(View v) {
// 版本更新的操作, 这个方法在下方实现
checkVersionTesk();
}
- 从服务器获得 版本号 并且跟 当前的进行对比
public void checkVersionTesk() {
new Thread() {
private BanBean getname;
@Override
public void run() {
// TODO Auto-generated method stub
// 版本更新的接口 这只是我的
String path = "http://www.oschina.net/MobileAppVersion.xml";
try {
//网络请求
URL url = new URL(path);
HttpURLConnection openConnection = (HttpURLConnection) url
.openConnection();
int responseCode = openConnection.getResponseCode();
if (responseCode == 200) {
InputStream inputStream = openConnection
.getInputStream();
getname = getname(inputStream);
// 返回对象 得到的信息
String versionCode = getname.getVersionCode();
downloadUrl = getname.getDownloadUrl();
if (versionCode.equals(versionName)) {
// 不需要升级
handler.sendEmptyMessage(0);
} else {
// 需要升级
handler.sendEmptyMessage(1);
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}.start();
}
- 弹出对话框通知用户更新程序
弹出对话框的步骤: 1.创建alertDialog的builder. 2.要给builder设置属性, 对话框的内容,样式,按钮
3.通过builder 创建一个对话框 4.对话框show()出来
//此方法在handler中调用了
public void showUpdataDialog() {
AlertDialog.Builder builer = new Builder(MainActivity.this);
builer.setTitle("版本升级");
builer.setMessage("检测到最新版本,确定要升级吗?");
// 当点确定按钮时从服务器上下载 新的apk 然后安装
builer.setPositiveButton("确定", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
// Log.i(TAG, "下载apk,更新");
downLoadApk();
}
});
// 当点取消按钮时进行登录
builer.setNegativeButton("取消", new OnClickListener() {
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog dialog = builer.create();
dialog.show();
}
- 从服务器中下载APK
-
// 安装apk
protected void installApk(File file) {
Intent intent = new Intent();
// 执行动作
intent.setAction(Intent.ACTION_VIEW);
// 执行的数据类型
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");// 编者按:此处Android应为android,否则造成安装不了
startActivity(intent);
}
- 从服务器下载apk:
public static File getFileFromServer(String path, ProgressDialog pd) {
// 如果相等的话表示当前的sdcard挂载在手机上并且是可用的
if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
try {
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url
.openConnection();
conn.setConnectTimeout(5000);
// 获取到文件的大小
pd.setMax(conn.getContentLength());
InputStream is = conn.getInputStream();
File file = new File(Environment.getExternalStorageDirectory(),
"updata.apk");
FileOutputStream fos = new FileOutputStream(file);
BufferedInputStream bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
int len;
int total = 0;
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
total += len;
// 获取当前下载量
pd.setProgress(total);
}
fos.close();
bis.close();
is.close();
return file;
} catch (MalformedURLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
} else {
return null;
}
return null;
}
- // 通过xml 解析版本更新的信息
public BanBean getname(InputStream inputStream) {
try {
XmlPullParser parser = Xml.newPullParser();
parser.setInput(inputStream, "utf-8");
int eventType = parser.getEventType();
BanBean banBean = new BanBean();
while (eventType != parser.END_DOCUMENT) {
String name = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if ("versionCode".equals(name)) {
banBean.setVersionCode(parser.nextText());
} else if ("versionName".equals(name)) {
banBean.setVersionName(parser.nextText());
} else if ("downloadUrl".equals(name)) {
banBean.setDownloadUrl(parser.nextText());
}
break;
default:
break;
}
eventType = parser.next();
}
return banBean;
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}