2.第三方更新: 其实和上一种方式基本相同需要集成第三方,仅仅是减少了我们的工作量,但是也有缺点,就是延时的问题 更新不会及时生效。
android.app.AlertDialog.Builder builder = new android.app.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();
@Override
public IBinder onBind(Intent intent) {
return null;
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
}
@Override
public void onDestroy() {
super.onDestroy();
}
RxPermissions.getInstance(this)
// 申请权限
.request(Manifest.permission.WRITE_EXTERNAL_STORAGE)
.subscribe(new Action1() {
@Override
public void call(Boolean granted) {
if(granted){
//请求成功
startDownload(downloadUrl);
}else{
// 请求失败回收当前服务
stopSelf();
}
}
});
//注册广播
receiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
install(context);
//销毁当前的Service
stopSelf();
}
};
registerReceiver(receiver, new IntentFilter(DownloadManager.ACTION_DOWNLOAD_COMPLETE));
return Service.START_STICKY;
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, "versionupdate.apk");
//设置下载时或者下载完成时,通知栏是否显示
request.setNotificationVisibility(DownloadManager.Request.VISIBILITY_VISIBLE_NOTIFY_COMPLETED);
request.setTitle("下载新版本");
//执行下载,并返回任务唯一id
enqueue = dm.enqueue(request);
}
public static void install(Context context) {
File file = new File( Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS) , "versionupdate.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以上 7.0对文件的权限有了新的修改
Uri apkUri = FileProvider.getUriForFile(context, "com.hxtj.versionupdate.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);
}
ndk { //设置支持的SO库架构 abiFilters 'armeabi' //, 'x86', 'armeabi-v7a', 'x86_64', 'arm64-v8a' }
compile 'com.tencent.bugly:crashreport_upgrade:latest.release' compile 'com.tencent.bugly:nativecrashreport:latest.release'
配置清单文件
在清单文件中加入Bulay的Activity
在application中初始化Bulay
Bugly.init(getApplicationContext(), "你的appid", false);
然后在手机上跑一个1.0的版本,在制作一个2.0的版本包 将2.0上传到bugly平台上启动。这样的话就完成了,相对来说比第一种方法简单了很多 ,如果对更新的样式之类的需求不是很强烈的话 (bugly对开发者也提供了一些不同的弹出样式以供选择,还是很人性化的) 可以使用这种更新方式,在启动之后会有几分钟的延迟效果才会生效。在接下来的热更新中延时效果会更加明显。
classpath‘com.tencent.bugly:tinker-support:1.1.1’
apply from: 'tinker-support.grald'
新建一个glade文件 tinker-support.grald 将官方文档的内容全部粘贴进入 覆盖之前的所有内容
compile "com.android.support:multidex:1.0.1"
初始化sdk
将tinker-support.grald中的enableProxyApplaction改为true
设置自动生成tinkerid : autoGenerateTinkerId=true
支持新增Activity : supportHotplugComponent=true
@Override
protected void attachBaseContext(Context base) {
super.attachBaseContext(base);
// you must install multiDex whatever tinker is installed!
MultiDex.install(base);
// 安装tinker
Beta.installTinker();
}