bugly 自定义更新弹窗,以及对强制更新与普通更新的区分

我的方式不一定适合所有人,看需要可以选择是否使用。

集成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;
        }
    }

    public  T 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);

自定义更新到这里就结束了,如果有问题,百度或者看看官方文档是最好的方法,虽然好多特立独行的业务需求官方文档也是有些无能为力,但是也是一个思路,比如跟我一样,用一些取巧的方式来达成目的,毕竟结果是最重要的,而不是方法。

 

 

你可能感兴趣的:(bugly 自定义更新弹窗,以及对强制更新与普通更新的区分)