天天看點

Android技術分享|Bugly 應用更新自定義UI

作者:anyRTC雲平台

最近項目裡的采用免費的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

繼續閱讀