最近項目裡的采用免費的Bugly應用更新功能,由于預設的 UI 非常的簡陋且與項目整體風格不搭,是以需要自定義UI,本篇文章記錄在實作過程中的一些注意事項。根據官方文檔可知,自定義更新界面有以下兩種方式。
一、固定控件ID
這種方式比較簡單,隻需要自己編寫布局,并設定控件的Tag 即可。
<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"/>
如圖所示,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 應用更新相關功能的實作記錄。