您的位置:首页 > 移动开发 > Android开发

Android 自动更新APK

2013-05-06 18:14 330 查看
 <pre name="code" class="java">第一次写博客,可能很多地方没表述清楚,请大家一定提出,我会多加改正,让博客的质量越来越好,下面直奔主题:
基本上每个应用都有这个功能:版本更新,当然我们公司的应用也不例外,由于我也是才接触Android,所以借鉴了许多前辈的方法,结合自己的了解和网上查阅的资料,总结了版本更新的主要逻辑如下:
1:获取当前应用的版本号、版本名称等
2:用当前版本号和原来的进行对比
3:如果版本相同,这提示是最新版本,不相同则去下载新的apk
4:用新的apk替换掉原来的apk,
下面分别介绍,粗糙代码,多多包涵

1:获取版本等:
/**
* 获取当前版本号
*/
public int getVersionCode() throws Exception {
// 获取PackageManager的实例
PackageManager packageManager = getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
0);
return packInfo.versionCode;
}

/**
* 获取当前版本名称
*/
public String getVersionName() throws Exception {
// 获取PackageManager的实例
PackageManager packageManager = getPackageManager();
// getPackageName()是你当前类的包名,0代表是获取版本信息
PackageInfo packInfo = packageManager.getPackageInfo(getPackageName(),
0);
return packInfo.versionName;
}

2:对比版本号
/**
* 从服务器获取XML文件解析并进行对比版本号
*/
public void checkUpdate() {
try {
// XML文件的路径
String path = getResources().getString(R.string.serverurl);
// 包装成URL对象
URL url = new URL(path);
HttpURLConnection conn = (HttpURLConnection) url.openConnection();
// 获取写入流对象
InputStream is = conn.getInputStream();
info = UpdataInfoManager.getUpdataInfo(is);
// 获取版本号
versionname = getVersionName();
// 版本号相同,无需升级
if (info.getVersion().equals(versionname)) {
pro_Dialog.dismiss();
thread = new Thread(runnable);
thread.start();
}
// 版本号不同,提示用户升级
else {
Message msg = new Message();
msg.what = UPDATA_CLIENT;
handler.sendMessage(msg);
}
} catch (Exception e) {
// 待处理
Message msg = new Message();
msg.what = GET_UNDATAINFO_ERROR;
handler.sendMessage(msg);
e.printStackTrace();
}

}
3:下载新的apk
/**
* 下载更新的方法
*/
protected void downLoadApk() {
// 得到更新地址
final String path = info.getUrl();
// 创建更新对话框
pd = new ProgressDialog(this);
pd.setProgressStyle(ProgressDialog.STYLE_HORIZONTAL);
pd.setMessage("正在下载更新");
pd.show();
// 创建线程开始更新
new Thread() {
@Override
public void run() {
try {
file = getFileFromServer(path, pd);
} catch (Exception e) {
// 创建消息对象
Message msg = new Message();
msg.what = DOWN_ERROR;
// 将消息发送出去
handler.sendMessage(msg);
e.printStackTrace();
}
}
}.start();
}
/**
* 下载更新
* @param path
* @param pd
* @return file
* @throws Exception
*/
public File getFileFromServer(String path, ProgressDialog pd)
throws Exception {
URL url = new URL(path);
conn = (HttpURLConnection) url.openConnection();
conn.setConnectTimeout(5000);
pd.setMax(100);
is = conn.getInputStream();
// 定义File用来存放apk
File file = new File(Environment.getExternalStorageDirectory(),
"main.apk");
// 判断文件是否存在,不存在则重新创建
if (!file.exists()) {
file.createNewFile();
}
// 否则就删除
else {
file.delete();
}
// 获取读写流对象
fos = new FileOutputStream(file);
bis = new BufferedInputStream(is);
byte[] buffer = new byte[1024];
// 定义变量表示下载的进度
int len = 0;
int cur = 0;
// 获取文件大小
int total = conn.getContentLength();
while ((len = bis.read(buffer)) != -1) {
fos.write(buffer, 0, len);
cur += len;
// 获取当前下载量
progress = (int) (((float) cur / total) * 100);
handler.sendEmptyMessage(DOWNLOAD_ING);
}
if (len == -1) {
handler.sendEmptyMessage(DOWNLOAD_OVER);
}
// 关闭读写流
fos.close();
bis.close();
is.close();
return file;
}
// 声明Handler接口用来判断更新状态
Handler handler = new Handler() {
@SuppressLint("HandlerLeak")
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what) {
case UPDATA_CLIENT:
pro_Dialog.dismiss();
// 对话框提示用户升级
showUpdataDialog();
break;
case DOWNLOAD_ING:
// 显示下载进度条
pd.setProgress(progress);
break;
case GET_UNDATAINFO_ERROR:
pro_Dialog.dismiss();
// 服务器超时
Toast.makeText(getApplicationContext(), "获取服务器更新信息失败", 1)
.show();
thread = new Thread(runnable);
thread.start();
break;
case DOWN_ERROR:
// 下载apk失败
Toast.makeText(getApplicationContext(), "下载新版本失败", 1).show();
break;
case DOWNLOAD_OVER:
// 下载apk成功
Toast.makeText(VersionActivity.this, "下载完成", 1).show();
pd.dismiss();
// 安装apk
installApk(file);
break;
}
}
};

4:最后就是替换成最新apk了
/**
* 安装apk的方法
* @param file
*/
protected void installApk(File file) {
Intent intent = new Intent();
// 执行动作
intent.setAction(Intent.ACTION_VIEW);
// 得到apk的路径
String openPath = Environment.getExternalStorageDirectory() + "/"
+ "main.apk";
// 执行的数据类型
intent.setDataAndType(Uri.parse("file://" + openPath),
"application/vnd.android.package-archive");
this.startActivity(intent);
}

以上就是我学到的更新版本的东西了,我也是站在巨人的肩膀上看世界,感谢那些无私奉献的程序员们。
希望我的技术越来越好,博客也越写越好。



</pre><pre class="java" name="code">
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: