Android版本更新(适用于6.0/7.0)
2017-11-30 17:05
330 查看
版本更新需要注意的点
1.选择弹窗进度条更新还是通知栏下载更新(根据需求定。本文是通知栏更新)
2.xml文件的配置
3.权限问题,(Android7.0引入“私有目录被限制访问”)
版本更新的大的步骤
1.创建一个service(在xml中注册常驻广播,保证应用没有杀死处于更新状态)
2.在service启动的时候创建一个广播接受者,用于接受下载完成的广播
3.当BroadcastReceiver接受到下载完成的广播时,开始执行安装。
下载服务
在manifest中注册服务
启动服务
《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
http://edu.csdn.net/course/play/6409/123752
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
http://edu.csdn.net/course/play/6409/123752
相关文章推荐
- Android 7.0 版本更新
- Android 版本更新下载自动安装APK,并解决Android6.0,7.0安装失败的问题
- android app版本升级(DownloadManager、适配6.0、7.0)
- 史前巨作之 Android 5.0 6.0 7.0 版本 调用相机闪退的完美解决方案
- android版本更新适配7.0,解决7.0手机无法更新安装apk
- Android apk升级 兼容6.0 7.0 低版本 华为手机
- APP版本更新(兼容6.0,7.0系统)
- Android调用系统相机、相册功能,适配6.0权限获取以及7.0以后获取URI(兼容多版本)
- Android版本更新-----兼容android7.0
- 直接拿来用的版本更新(Android 兼容7.0)
- Android 版本更新工具 兼容7.0
- Android使用DownloadMange进行版本更新(兼容7.0)
- android 7.0 apk版本更新,下载之后自动安装
- Android 版本更新(非热更新) 适配7.0更新 以及三星 note系列读取内存相关目录无权限问题
- 项目android 6.0,7.0 版本适配问题
- 从 xUtils 中发现的Android 6.0 版本更新问题
- Android Studio 更新 Android 6.0 之后无法找到 org.apache.http 包的问题
- Android版本检测\自动更新
- android-关于友盟的自动版本更新(面向小白)