版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/android_gjw/article/details/78678331
版本更新需要注意的点
1.选择弹窗进度条更新还是通知栏下载更新(根据需求定。本文是通知栏更新)
2.xml文件的配置
3.权限问题,(Android7.0引入“私有目录被限制访问”)
版本更新的大的步骤
1.创建一个service(在xml中注册常驻广播,保证应用没有杀死处于更新状态)
2.在service启动的时候创建一个广播接受者,用于接受下载完成的广播
3.当BroadcastReceiver接受到下载完成的广播时,开始执行安装。
下载服务
public class DownLoadServerice extends Service {
/**广播接受者*/
private BroadcastReceiver receiver;
/**系统下载管理器*/
private DownloadManager dm;
/**系统下载器分配的唯一下载任务id,可以通过这个id查询或者处理下载任务*/
private long enqueue;
private String downloadUrl=""; //下载地址
@Nullable
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
install(context);
//销毁当前的Service
stopSelf();
}
};
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
//下载需要写SD卡权限, targetSdkVersion>=23 需要动态申请权限
RxPermissions.getInstance(this)
// 申请权限
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Action1<Boolean>() {
@Override
public void call(Boolean granted) {
if(granted){
//请求成功
startDownload(downloadUrl);
}else{
// 请求失败回收当前服务
stopSelf();
}
}
});
return Service.START_STICKY;
}
/**
* 通过隐式意图调用系统安装程序安装APK
*/
public static void install(Context context) {
File file = new File(
Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS)
, "AMedical.apk");
Intent intent = new Intent(Intent.ACTION_VIEW);
// 由于没有在Activity环境下启动Activity,设置下面的标签
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
if(Build.VERSION.SDK_INT>=24) { //判读版本是否在7.0以上
//参数1 上下文, 参数2 Provider主机地址 和配置文件中保持一致 参数3 共享的文件
Uri apkUri =
FileProvider.getUriForFile(context, "com.hxtj.verupdate.fileprovider", file);
//添加这一句表示对目标应用临时授权该Uri所代表的文件
intent.addFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);
intent.setDataAndType(apkUri, "application/vnd.android.package-archive");
}else{
intent.setDataAndType(Uri.fromFile(file),
"application/vnd.android.package-archive");
}
context.startActivity(intent);
}
@Override
public void onDestroy() {
//服务销毁的时候 反注册广播
unregisterReceiver(receiver);
super.onDestroy();
}
private void startDownload(String downUrl) {
//获得系统下载器
dm = (DownloadManager) getSystemService(DOWNLOAD_SERVICE);
//设置下载地址
DownloadManager.Request request = new DownloadManager.Request(Uri.parse(downUrl));
//设置下载文件的类型
request.setMimeType("application/vnd.android.package-archive");
//设置下载存放的文件夹和文件名字
request.setDestinationInExternalPublicDir(Environment.DIRECTORY_DOWNLOADS, "AMedical.apk");
//设置下载时或者下载完成时,通知栏是否显示
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("下载新版本");
//执行下载,并返回任务唯一id
enqueue = dm.enqueue(request);
}
}
在manifest中注册服务
<service android:name=".DownLoadServerice" />
启动服务
AlertDialog.Builder builder=new AlertDialog.Builder(MainActivity.this);
builder.setTitle("温馨提示!");
builder.setMessage("是否要更新");
builder.setPositiveButton("立即更新", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.dismiss();
Intent intent=new Intent(MainActivity.this, DownLoadServerice.class);
startService(intent);
}
});
builder.setNegativeButton("以后再说", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int i) {
dialog.dismiss();
}
});
builder.create().show();
《Android版本更新、热更新》系列课程视频
版本更新6.0,7.0统统搞定!!
热修复不在麻烦,再也不用担心上线后出bug!!
http://edu.csdn.net/course/detail/6523
http://edu.csdn.net/course/play/6523/131198
《Kotlin语法基础到实战开发》系列课程视频
http://edu.csdn.net/course/detail/6409?locationNum=7&fps=1&ref=srch&loc=1