应用场景:在检查版本更新的时候经常需要从服务器端下载然后安装到手机中
使用工具: XUtils,这个开源的框架真的是需要花大把时间去阅读和理解的,十分有用的,on the way ! fighting!
下载:github中关键字搜索即可download
//google提供的保留地址,不会随着电脑ip地址的变化而改变测试ip地址
private static final String mDownloadUrl= "http://10.0.2.2:8080/xxx.apk"; protected void downloadApk() { if (Environment.getExternalStorageState().equals(
Environment.MEDIA_MOUNTED)) {
//下载apk到sd的路径
String sdPath = Environment.getExternalStorageDirectory()
.getAbsolutePath() + File.separator + "xxx.apk";
HttpUtils httpUtils = new HttpUtils(); httpUtils.download(mDownloadUrl, sdPath,
new RequestCallBack<File>() { @Override
public void onStart() {
Log.i(tag, "开始下载");
super.onStart();
} @Override
public void onLoading(long total, long current,
boolean isUploading) {
Log.i(tag, "正在下载中");
Log.i(tag, "total = " + total);
Log.i(tag, "current = " + current);
super.onLoading(total, current, isUploading);
} @Override
public void onSuccess(ResponseInfo<File> responseInfo) {
Log.i(tag, "下载完成");
//获取下载好的文件路径
File file = responseInfo.result;
//安装apk
installApk(file); } @Override
public void onFailure(HttpException error, String msg) {
Log.i(tag, "下载失败");
} });
}
}
通过隐式意图去实现下载
通过查询源码把下面代码抠出来
/*
* <intent-filter> <action android:name="android.intent.action.VIEW" />
* <category android:name="android.intent.category.DEFAULT" />
* <data android:scheme="content" /> <data android:scheme="file" />
* <data android:mimeType="application/vnd.android.package-archive" />
* </intent-filter>
*/
然后就是一个简单的隐式意图开启Activity的过程
protected void installApk(File file) {
Intent intent = new Intent();
intent.setAction("android.intent.action.VIEW");
intent.addCategory("android.intent.category.DEFAULT");
/*
* intent.setData(Uri.fromFile(file));
* intent.setType("application/vnd.android.package-archive");
*/
//与被注释代码等价,但推荐使用下述方法,被注释方法存在一个finish问题
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive"); startActivity(intent);
}
//卸载应用的方法同上,找到对应的源码,查看安卓系统是怎么实现的
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<action android:name="android.intent.action.DELETE" />
<category android:name="android.intent.category.DEFAULT" />
<data android:scheme="package" />
</intent-filter>
//同上,开启意图即可
protected void uninstall(){
Intent intent = new Intent();
intent.setAction(Intent.ACTION_DELETE);
intent.addCategory("android.intent.category.DEFAULT");
intent.setData(Uri.parse("package:"+包名));
startActivity(intent);
}