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

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

集成bugly的更新功能,我想用到这个的时候应该都弄完了吧,没弄完的话,可以参考以下文档:

https://blog.csdn.net/Liu_ser/article/details/82886268

bugly全量更新与热修复。

下面是自定义更新弹窗,不过是个类,而不是弹窗,如果有想法的话,可以自己修改成弹窗。

布局,名字最好别乱改,要与bugly文档里的进行对应

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical" android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/transparent"
    >
    <LinearLayout
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:orientation="vertical"
        android:background="@color/white"
        android:layout_marginTop="400px"
        android:layout_marginLeft="100px"
        android:layout_marginRight="100px"
        >

        <TextView
            android:id="@+id/title"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="20sp"
            android:text=""
            android:layout_marginLeft="10dp"
            android:textColor="@color/black"
            android:layout_marginTop="10px"

            />

        <TextView
            android:id="@+id/version"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="版本号:"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"

            />
        <TextView
            android:id="@+id/size"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="包大小:"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:visibility="gone"
            />
        <TextView
            android:id="@+id/time"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="更新时间:"
            android:layout_marginTop="5dp"
            android:layout_marginLeft="10dp"
            android:visibility="gone"
            />

        <TextView

            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="更新说明:"
            android:layout_marginTop="5dp"
            android:textColor="@color/black"
            android:layout_marginLeft="10dp"

            />
        <TextView
            android:id="@+id/content"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:textSize="15sp"
            android:text="修改信息"
            android:layout_marginTop="5dp"
            android:textColor="@color/black"
            android:layout_marginLeft="10dp"

            />

        <TextView
            android:id="@+id/tv"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="下载进度"
            android:layout_marginTop="5dp"
            android:gravity="center"
            android:visibility="gone"
            />
        <ProgressBar
            android:layout_marginLeft="5dp"
            android:layout_marginRight="5dp"
            android:layout_marginTop="20dp"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_gravity="center_vertical"
            android:id="@+id/progress"
            android:max="100"
            android:progress="0"
            android:layout_width="match_parent"
            android:layout_height="20dp"
            android:visibility="gone"/>
        <LinearLayout
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:orientation="horizontal"
            android:background="@color/two_light_grey"
            android:layout_marginTop="5dp"
            >
            <Button
                android:id="@+id/cancel"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:layout_marginTop="1dp"
                android:layout_marginRight="1dp"
                android:text="下次再说"
                android:textSize="20sp"
                android:textColor="@color/dark_grey"
                />

            <Button
                android:id="@+id/start"
                android:layout_width="0dp"
                android:layout_weight="1"
                android:layout_height="wrap_content"
                android:background="@color/white"
                android:layout_marginTop="1dp"
                android:textSize="20sp"
                android:text="立即更新"
                android:textColor="@color/black"
                />
        </LinearLayout>

    </LinearLayout>
</LinearLayout>

更新类:

/**更新弹窗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 extends View> T getView(int id) {
        return (T) findViewById(id);
    }

}

然后在清单文件里进行注册

<activity android:name=".ui.UpgradeActivity"
    android:theme="@style/noAnimTheme"
    />
<!--透明背景-->
  <style name="noAnimTheme"
      parent="@style/Theme.AppCompat.Light.NoActionBar">
      <item name="android:windowAnimationStyle">@null</item>
      <item name="android:windowBackground">@android:color/transparent</item>
      <item name="android:colorBackgroundCacheHint">@null</item>
      <item name="android:windowIsTranslucent">true</item>
      <item name="android:duration">800</item>
  </style>

 

在需要更新的地方调用:

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

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

 

 

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值