最近公司项目需要APK更新,使用到了DownLoadManager, 之前也写过一篇博客是:apk更新原理,可以看下。
使用DownLoadManaager优点无非就是,不需要自己去实现,只要给它一个Url,自己内部能够去实现,支持查看下载状态。
先说一下,更新的流程吧
- 请求服务器,获取到版本号
- 比较版本号大小,大于就更新,就弹出Dialog提示用户更新APK,小于就不显示Dialog。
- 点击更新APK ,此时先检查APK是否存在,不存在的话就下载;存在话,就比较版本号,大于本应用的version说明之前已经下载过了APK,只不过没安装,此时直接安装;小于本应用就直接下载。
- 使用DownLoadManager下载APK
- 下载成功之后,判断本Android版本是否是大于Android.N(7.0);7.0以上和7.0一下的安装方法是不一样的。
下面是原理图:
至于DownloadManager的使用,网上一大堆,在这不再叙述。
说一下注意点:
- 7.0以下的安装方法:
Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setDataAndType(Uri.fromFile(new File(filePath)), "application/vnd.android.package-archive");
context.startActivity(intent);
7.0以上的安装方法:
首先在AndroidManifest中注册:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="com.bluetown.health"
android:exported="false"
android:grantUriPermissions="true">
<!-- 元数据 -->
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/app_update_file_paths" />
</provider>
然后在res目录下创建xml文件夹,在res/xml目录下创建app_update_file_paths文件,文件内容:
<?xml version="1.0" encoding="utf-8"?>
<resources xmlns:android="http://schemas.android.com/apk/res/android">
<paths>
<external-path path="." name="download"/>
</paths>
</resources>
最后Java调用:
Intent intentInstall = new Intent(Intent.ACTION_VIEW);
File file = new File(filePath);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intentInstall.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri = FileProvider.getUriForFile(context, "com.bluetown.health", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intentInstall.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intentInstall.setDataAndType(apkUri, "application/vnd.android.package-archive");
context.startActivity(intentInstall);
2:需求:下载过程中,退出应用,下载仍在继续,下载完成之后,跳转到安装页面。
DownLoadManager下载完成之后会发送一个广播,将该广播注册成静态广播