我的方式不一定适合所有人,看需要可以选择是否使用。
集成bugly的更新功能,我想用到这个的时候应该都弄完了吧,没弄完的话,可以参考以下文档:
https://blog.csdn.net/Liu_ser/article/details/82886268
bugly全量更新与热修复。
下面是自定义更新弹窗,不过是个类,而不是弹窗,如果有想法的话,可以自己修改成弹窗。
布局,名字最好别乱改,要与bugly文档里的进行对应
更新类:
/**更新弹窗demo * Created by IKL on 2019/4/22 */ public class UpgradeActivity extends Activity { private TextView tv; private TextView title; private TextView version; private TextView size; private TextView time; private TextView content; private Button cancel; private Button start; private ProgressBar number; private int fileSize; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); this.requestWindowFeature(Window.FEATURE_NO_TITLE); setContentView(R.layout.activity_upgrade); //设置状态栏 PublicMethods.setImmersionStatus(UpgradeActivity.this, R.color.dark_blue1); tv = getView(R.id.tv); title = getView(R.id.title); version = getView(R.id.version); size = getView(R.id.size); time = getView(R.id.time); content = getView(R.id.content); cancel = getView(R.id.cancel); start = getView(R.id.start); number = getView(R.id.progress); /*获取下载任务,初始化界面信息*/ updateBtn(Beta.getStrategyTask()); //包大小 fileSize= new Long(Beta.getUpgradeInfo().fileSize).intValue(); tv.setText(tv.getText().toString() + Beta.getStrategyTask().getSavedLength() + "");//当前下载进度,不过隐藏了 /*获取策略信息,初始化界面信息*/ title.setText(title.getText().toString() + Beta.getUpgradeInfo().title);//标头 version.setText(version.getText().toString() + Beta.getUpgradeInfo().versionName);//版本号 size.setText(size.getText().toString() + Beta.getUpgradeInfo().fileSize + "");//更新包大小,已隐藏 long times=Beta.getUpgradeInfo().publishTime/1000;//更新时间,返回的是long时间戳,不过转化后有点对不上,以隐藏 String s = timeStampToDate(times); time.setText(time.getText().toString() + s + ""); content.setText(Beta.getUpgradeInfo().newFeature);//更新说明 number.setMax(fileSize );//设置进度条最大值,就是更新包的大小 /*为下载按钮设置监听*/ start.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { // tv.setVisibility(View.VISIBLE); number.setVisibility(View.VISIBLE); DownloadTask task = Beta.startDownload(); updateBtn(task); if (task.getStatus() == DownloadTask.DOWNLOADING) { // finish(); ToastUtils.showShortToast(UpgradeActivity.this,"开始下载"); } } }); /*为取消按钮设置监听*/ cancel.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Beta.cancelDownload(); Intent intent = new Intent();//取消更新回到起始页 setResult(1001, intent); finish(); } }); /*注册下载监听,监听下载事件*/ Beta.registerDownloadListener(new DownloadListener() { @Override public void onReceive(DownloadTask task) { updateBtn(task); tv.setText(task.getSavedLength() + ""); int li= new Long(task.getSavedLength()).intValue(); number.setProgress(li);//更新进度条 } @Override public void onCompleted(DownloadTask task) { updateBtn(task); tv.setText(task.getSavedLength() + ""); } @Override public void onFailed(DownloadTask task, int code, String extMsg) { updateBtn(task); tv.setText("failed"); number.setVisibility(View.GONE); } }); } //将long的时间戳转为时间 public static String timeStampToDate(long tsp, String... format) { SimpleDateFormat sdf; if (format.length < 1) { sdf = new SimpleDateFormat("yyyy年MM月dd日 HH:mm:ss", Locale.getDefault()); } else { sdf = new SimpleDateFormat(format[0], Locale.getDefault()); } return sdf.format(tsp); } @Override protected void onResume() { super.onResume(); } @Override protected void onStop() { super.onStop(); } @Override protected void onDestroy() { super.onDestroy(); /*注销下载监听*/ Beta.unregisterDownloadListener(); } public void updateBtn(DownloadTask task) { /*根据下载任务状态设置按钮*/ switch (task.getStatus()) { case DownloadTask.INIT: case DownloadTask.DELETED: case DownloadTask.FAILED: { start.setText("开始下载"); } break; case DownloadTask.COMPLETE: { start.setText("安装"); } break; case DownloadTask.DOWNLOADING: { start.setText("暂停"); } break; case DownloadTask.PAUSED: { start.setText("继续下载"); } break; } } publicT getView(int id) { return (T) findViewById(id); } }
然后在清单文件里进行注册
在需要更新的地方调用:
UpgradeInfo upgradeInfo = Beta.getUpgradeInfo(); if (upgradeInfo != null) { //进来就检测是否有新版本 有就提醒更新并显示红点 //升级策略 1建议 2强制 3手工 int upgradeType = Beta.getUpgradeInfo().upgradeType; if (upgradeType==2){ checkVersionName();//强制更新 }else { //非强制更新 Intent intent = new Intent(SplashActivity.this, UpgradeActivity.class); startActivityForResult(intent, 1000); } } else { // //隐藏红点提示,没有更新策略的处理 }
//-------------强制更新调用的,也可以不调用--------
//bugly检查更新,设置更新弹窗弹出时间间隔 private void checkVersionName() { Beta.checkUpgrade(); Beta.strToastYourAreTheLatestVersion = null; Beta.strToastCheckingUpgrade = null; Beta.strToastCheckUpgradeError = null; Beta.upgradeCheckPeriod = 60 * 1000; }
//-------------回传值接受,接收到自定义更新类那里下次再说的事件,让功能继续向下走----------------------
@Override protected void onActivityResult(int requestCode, int resultCode, Intent data) { super.onActivityResult(requestCode, resultCode, data); if(requestCode == 1000 && resultCode == 1001) { getNet(1000); } }
这么一来,自定义更新界面就完成了,布局自己随意改,但是现在有个问题,就是会在你的基础上,监测更新的时候回再次弹出一个原弹窗覆盖你现在的弹窗,那就不行了,所以我用了一个取巧的方式,如果你有别的方法也能告诉我一声。
在全局类里,设置bugly的初始化,以及自动检查更新,如果不设置的话就需要你手动设置,也就是我上面强制更新里面的那些,而为了不让弹窗覆盖,就是设置一个canShowUpgradeActs,设置显示更新弹窗的类,除了此类外不在其余类显示,这样你可以将类设置成一个不重要的类,也可以是一个专门用来在项目内部自主更新的类里面,最明显的就是设置里的,大家都懂。
* 只允许在MainActivity上显示更新弹窗,其他activity上不显示弹窗; * 不设置会默认所有activity都可以显示弹窗; */ Beta.autoInit = true; Beta.autoCheckUpgrade = true;//自动检查更新 /** * 点击过确认的弹窗在APP下次启动自动检查更新时会再次显示; */ // Beta.showInterruptedStrategy = false; Beta.canShowUpgradeActs.add(显示原更新弹窗的类,可以放一个专门用来更新的类);//可以添加多个此方法 Bugly.init(this, "换成自己项目的", false);
自定义更新到这里就结束了,如果有问题,百度或者看看官方文档是最好的方法,虽然好多特立独行的业务需求官方文档也是有些无能为力,但是也是一个思路,比如跟我一样,用一些取巧的方式来达成目的,毕竟结果是最重要的,而不是方法。