Android App更新

对于Android开发者而言,App应用内更新是不可避免的,强制更新和非强制更新也不相同。本文记录使用系统
自带的DownloadManager来实现App的普通更新和强制更新。DownloadManager已经帮我们处理好了网络和
通知栏的事情,我们只需要指定下载路径,指定通知栏样式和显示策略。

DownloadManager.Request request = new DownloadManager.Request(Uri.parse(UPDATE_DOWN_URL));
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setDestinationInExternalFilesDir(activity.get(), Environment.DIRECTORY_DOWNLOADS, UPDATE_SAVENAME);
request.allowScanningByMediaScanner();
// 设置一些基本显示信息
request.setTitle("正在下载");
request.setDescription("更新中...");
request.setMimeType("application/vnd.android.package-archive");
final long enqueueId = downloadManager.enqueue(request);

要点一:非强制更新,直接后台下载就好了,强制更新需要显示进度条,获取进度的方式有很多。1,是使用ContentResolver来获取下载的进度。2,可以使用定时器去轮训获取进度。获取进度如下:

private int[] getBytesAndStatus(long downloadId) {
    int[] bytesAndStatus = new int[]{-1, -1, 0};
    DownloadManager.Query query = new DownloadManager.Query().setFilterById(downloadId);
    Cursor c = null;
    try {
        c = downloadManager.query(query);
        if (c != null && c.moveToFirst()) {
            bytesAndStatus[0] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_BYTES_DOWNLOADED_SO_FAR));
            bytesAndStatus[1] = c.getInt(c.getColumnIndexOrThrow(DownloadManager.COLUMN_TOTAL_SIZE_BYTES));
            bytesAndStatus[2] = c.getInt(c.getColumnIndex(DownloadManager.COLUMN_STATUS));
        }
    } finally {
        if (c != null) {
            c.close();
        }
    }
    return bytesAndStatus;
}

要点二:下载完成的通知,接收DownloadManager的完成广播。

DownloadManager.ACTION_DOWNLOAD_COMPLETE.equals(intent.getAction())

要点三:系统版本不同,DownloadManager返回的downUri不同,需要要注意。分低于android6.0,android6.0,android7.0,android8.0这些版本。android7.0需要使用FileProvider来获取下载的文件路径。android 8.0上需要注意 未知来源,获取未知来源的权限:

@RequiresApi(api = Build.VERSION_CODES.O)
private void requestInstall() {
    Uri packageURI = Uri.parse("package:" + this.getPackageName());
    Intent intent = new Intent(Settings.ACTION_MANAGE_UNKNOWN_APP_SOURCES, packageURI);
    startActivityForResult(intent, INSTALL_PACKAGES_REQUESTCODE);
}

记得在AndroidManifest文件添加权限

  <!-- 8.0安装apk权限,需要允许安装未知应用 -->
<uses-permission android:name="android.permission.REQUEST_INSTALL_PACKAGES" />

需要注意的差不多就是这些吧。强制更新下载的时候,如果有推送消息之类的,最好给关闭掉。避免用户通过推送进入App。
推荐一篇博客,写的很不错。Android app 在线更新那点事儿(适配Android6.0、7.0、8.0)


一如既往,感谢前辈们!

努力前行!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值