Android版本更新(适用于6.0/7.0)

来源:互联网 发布:格力壁挂空调 知乎 编辑:程序博客网 时间:2024/05/21 22:49

版本更新需要注意的点
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