Android APK更新(DownloadManager)

最近公司项目需要APK更新,使用到了DownLoadManager, 之前也写过一篇博客是:apk更新原理,可以看下。

使用DownLoadManaager优点无非就是,不需要自己去实现,只要给它一个Url,自己内部能够去实现,支持查看下载状态。

先说一下,更新的流程吧

  1. 请求服务器,获取到版本号
  2. 比较版本号大小,大于就更新,就弹出Dialog提示用户更新APK,小于就不显示Dialog。
  3. 点击更新APK ,此时先检查APK是否存在,不存在的话就下载;存在话,就比较版本号,大于本应用的version说明之前已经下载过了APK,只不过没安装,此时直接安装;小于本应用就直接下载。
  4. 使用DownLoadManager下载APK
  5. 下载成功之后,判断本Android版本是否是大于Android.N(7.0);7.0以上和7.0一下的安装方法是不一样的。

下面是原理图:
这里写图片描述

至于DownloadManager的使用,网上一大堆,在这不再叙述。

说一下注意点:

  1. 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下载完成之后会发送一个广播,将该广播注册成静态广播

猜你喜欢

转载自blog.csdn.net/lmq121210/article/details/79144231