最近项目里的选用免费的Bugly使用晋级功能,因为默许的 UI 十分的粗陋且与项目全体风格不搭,所以需求自定义UI,本篇文章记录在完成过程中的一些留意事项。依据官方文档可知,自定义晋级界面有以下两种方法。

一、固定控件ID

这种方法比较简单,只需求自己编写布局,并设置控件的Tag 即可。

Android技术分享| Bugly 应用升级自定义UI
<TextView
 android:layout_width="match_parent"
 android:layout_height="@dimen/dp_62"
 android:gravity="center"
 android:tag="beta_title" //按要求设置Tag即可
 android:textSize="@dimen/sp_16"
 android:textColor="@color/white"
 android:text="发现新版别"/>

这儿有个需求留意的当地便是beta_title beta_upgrade_info beta_upgrade_feature beta_cancel_button beta_confirm_button 这几个控件 Tag 缺一不可,缺了会导致整个页面是黑色的。

经过以上设置,根本就能够展示自己的 UI 了,但随即也会发现一个问题:状态栏是黑色,下方还有一条灰色的类似 ActionBa r的东西。

查阅文档发现,能够注 Bugly 弹窗的生命周期回调,如下所示。

Beta.upgradeDialogLifecycleListener = object :UILifecycleListener<UpgradeInfo>{
            override fun onCreate(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
            override fun onStart(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
            override fun onResume(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
            override fun onPause(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
            override fun onStop(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
            override fun onDestroy(p0: Context?, p1: View?, p2: UpgradeInfo?) {
            }
        }

对应的便是 BetaActivity 的生命周期,所以只需求在 onCreate 回调中,设置沉溺式状态即可。

至于怎样设置能够按照自己项目里的来,我设置了沉溺式,但有一条灰色的还是去不掉。而且这个方法无法满足我

们项目产品的要求,需求有进度条显现。所以能够用另外一种自定义 Activity的方法。

二、自定义Activity

使用这种方法尽管比第一种稍微复杂了一点点,可是可定制的范围却大了许多。弹窗界面的绘制与生命周期均由自己保护,Bugly 负责下载时回调与事件上报,并供给相关接口控制使命下载,获取使命状态等。

1.设置接纳更新战略回调
Beta.upgradeListener = object : UpgradeListener {
            override fun onUpgrade(p0: Int, p1: UpgradeInfo?, p2: Boolean, p3: Boolean) {
                p1?.let {
                    startActivity(Intent(applicationContext, UpdateActivity::class.java).apply {
                        flags = Intent.FLAG_ACTIVITY_NEW_TASK
                    })
                }
            }
  }

留意这一步要写在 init 之前。在这儿判别了 如果 UpgradeInfo 不会null的话,阐明有更新了,所以跳转到自定义的 Activity 即可。

更新一般都是弹窗,然后我们跳转到 Activity,就无法看见下方 Activity,跳转动画也比较僵硬,契合习惯的应该是像一般弹窗相同弹出即可。所以这儿需求将 Activity Dialog化。

2. 设置 Activity 通明

只需求自定义一个 Style 即可,如下。

<style name="updateStyle" parent="Theme.AppCompat.Light.NoActionBar">
        <item name="android:windowFrame">@null</item>
        <!-- 半通明 -->
        <item name="android:windowIsTranslucent">true</item>
        <!-- 无标题 -->
        <item name="android:windowNoTitle">true</item>
        <!-- 背景通明 -->
        <item name="android:windowBackground">@color/transparent</item>
        <!-- 是否允许对话框的背景变暗 -->
        <item name="android:backgroundDimEnabled">true</item>
</style>

然后给自定义的Activity设置上即可。

 <activity
            android:name=".activity.setting.UpdateActivity"
            android:exported="false"
            android:theme="@style/updateStyle"
            android:screenOrientation="portrait"/>
Android技术分享| Bugly 应用升级自定义UI

如图所示,Activity 现已变得和 Dialog 一模相同了。

3.获取战略信息
val upgradeInfo = Beta.getUpgradeInfo()
binding.run {
   if (upgradeInfo.upgradeType==2){//如果是强制晋级
        betaCancelButton.gone()//躲藏下次再说按钮
    }
    betaUpgradeFeature.text = upgradeInfo.newFeature //显现更新内容
}

UpgradeInfo 包括如下信息,如果是强制晋级的话,需求躲藏相应按钮,并且屏蔽掉返回按键。

		public String id = "";//唯一标识
    public String title = "";//晋级提示标题
    public String newFeature = "";//晋级特性描绘
    public long publishTime = 0;//晋级发布时间,ms
    public int publishType = 0;//晋级类型 0测试 1正式
    public int upgradeType = 1;//晋级战略 1建议 2强制 3手工
    public int popTimes = 0;//提示次数
    public long popInterval = 0;//提示距离
    public int versionCode;
    public String versionName = "";
    public String apkMd5;//包md5值
    public String apkUrl;//APK的CDN外网下载地址
    public long fileSize;//APK文件的巨细
    pubilc String imageUrl; // 图片url
4.获取下载使命
 var strategyTask = Beta.getStrategyTask()

在 strategyTask 目标中,我们能够判别之前是否现已下载完了。

strategyTask?.let {
    if (it.saveFile!=null){
         betaCancelButton.gone()
         betaConfirmButton.text = "装置"
         isFileSave = true
      }
    }

如果存在之前下载好但没装置的 Apk ,就能够直接去装置即可。

 Beta.installApk(strategyTask?.saveFile)
4.下载
 //首要 Activity 完成 DownloadListener 接口
class UpdateActivity : AppCompatActivity(), DownloadListener {
		override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        Beta.registerDownloadListener(this)//注册下载事件回调
     }
      override fun onDestroy() {
        super.onDestroy()
        Beta.unregisterDownloadListener()//取消监听下载事件
    }
     override fun onBackPressed() {
     	//屏蔽返回按钮
    }
		//下载接纳中
    override fun onReceive(p0: DownloadTask?) {
    p0?.let {        		binding.pb.setProgress(((it.savedLength.toDouble()/it.totalLength.toDouble())*100).toInt())
       }
    }
		//下载完成
    override fun onCompleted(p0: DownloadTask?) {
       binding.betaConfirmButton.text = "装置"
        binding.betaConfirmButton.isClickable = true
        isFileSave = p0?.saveFile!=null
    }
		//下载失败
    override fun onFailed(p0: DownloadTask?, p1: Int, p2: String?) {
    }
}

我们先注册回调,直接调用Beta.startDownload()就能够开端下载了,在onReceive 中能够获取下载进度。下载完成后会自定装置。也能够设置 Beta.autoInstallApk = false手动装置

三:显现小红点

在 App 关于中,一般都有一个版别显现,点击能够手动查看更新,或许又更新的话显现一个小红点提示用户去点击,用Bugly其实也能够完成,步骤如下。

 Beta.getUpgradeInfo()?.let {
    ivRedDot.show()
 }?:let { ivRedDot.gone() }

获取晋级信息,不为null就阐明又更新战略,显现小红点即可。

下面是点击查看晋级,留意第二个参数,是是否显现弹窗。

rlCheckUpdate.click {
   Beta.checkUpgrade(true,false)
}

以上便是关于 Bugly 使用晋级相关功能的完成记录。

Android技术分享| Bugly 应用升级自定义UI