您的位置:首页 > 移动开发 > Android开发

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

2017-11-30 17:05 330 查看
版本更新需要注意的点

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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: