官术网_书友最值得收藏!

2.1 從廣告引導頁的需求說起

在實際App項目開發中,廣告引導頁是一個很常見的需求,具體描述如下:

  • 用戶打開App顯示5秒鐘的廣告,廣告結束后進入App主頁面。
  • 廣告結束前,用戶可以點擊跳過廣告。
  • 頁面銷毀時,計時器銷毀。

下面通過代碼實現上述需求,首先新建一個廣告管理工具類AdvertisingManage,在AdvertisingManage中新建計時開始、終止等方法,具體如下:

class AdvertisingManage {
    var TAG = "AdvertisingManage"
    //監聽事件
    var advertisingManageListener: AdvertisingManageListener? = null
    //定時器
    private var countDownTimer: CountDownTimer? = object : CountDownTimer(5000, 1000){
        override fun onTick(millisUntilFinished: Long) {
            Log.d(TAG, "廣告剩余${(millisUntilFinished / 1000).toInt()}秒")
            advertisingManageListener?.timing((millisUntilFinished / 1000).toInt())
        }
        override fun onFinish() {
            Log.d(TAG, "廣告結束,準備進入主頁面")
            advertisingManageListener?.enterMainActivity()
        }
    }
      /**
       * 開始計時
       */
    fun start() {
        Log.d(TAG, "開始計時")
        countDownTimer?.start()
    }
      /**
       * 停止計時
       */
    fun onCancel() {
        Log.d(TAG, "停止計時")
        countDownTimer?.cancel()
        countDownTimer = null
    }
        /**
         *廣告管理接口
         */
    interface AdvertisingManageListener {
        /**
         * 計時
         * @param second秒
         */
        fun timing(second: Int)
            /**
             * 計時結束, 進入主頁面
             */
        fun enterMainActivity()
    }
}

然后在引導頁AdvertisingActivity中,基于onCreate方法實現開始計時,基于onDestroy方法實現取消計時,AdvertisingActivity的主要代碼如下:

class AdvertisingActivity : AppCompatActivity() {
    //跳過廣告按鈕
    lateinit var btnIngore: Button
    //廣告時間
    lateinit var tvAdvertisingTime: TextView
    private var advertisingManage: AdvertisingManage? = null
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_advertising)
        btnIngore = findViewById(R.id.btn_ignore)
        tvAdvertisingTime = findViewById(R.id.tv_advertising_time)
        advertisingManage = AdvertisingManage()
        advertisingManage?.advertisingManageListern =
            object : AdvertisingManage.AdvertisingManageListern {
                override fun timing(second: Int) {
                    tvAdvertisingTime.text = "廣告剩余$second秒"
                }
                override fun enterMainActivity() {
                    MainActivity.actionStart(this@AdvertisingActivity)
                    finish()
                }
            }
        //跳過廣告點擊事件
        btnIngore.setOnClickListener {
            MainActivity.actionStart(this@AdvertisingActivity)
            finish()
        }
        //開始廣告
        advertisingManage?.start()
    }
    override fun onDestroy() {
        super.onDestroy()
        advertisingManage?.onCancel()
    }
}

運行程序,在5秒后廣告會自動結束,運行日志如圖2-1所示。

020-1

圖2-1 運行日志

再次運行程序,在第3秒時,點擊跳過廣告,運行日志如圖2-2所示。

020-2

圖2-2 跳過廣告運行日志

這樣就實現了廣告引導頁的需求,但是這種實現方式不夠優雅,因為開發者需要在Activity對應生命周期的方法中主動執行相關的方法,當與生命周期相關聯的方法越來越多時,業務的改動就會導致Activity層的處理邏輯難以維護,那么有沒有什么辦法可以讓管理類主動執行Activity對應生命周期的方法呢?這就是本章要認識的第一個Jetpack組件——Lifecycle。

主站蜘蛛池模板: 肃南| 河津市| 曲靖市| 古交市| 五常市| 大埔县| 满洲里市| 孟州市| 建水县| 连南| 凯里市| 乐至县| 精河县| 吉木乃县| 大同县| 潞西市| 无为县| 龙井市| 昌乐县| 连州市| 东兰县| 彝良县| 唐山市| 比如县| 郯城县| 杭锦后旗| 景泰县| 古丈县| 铁岭县| 西青区| 乐业县| 永济市| 郓城县| 兴宁市| 犍为县| 梨树县| 麻城市| 阿勒泰市| 宁河县| 高唐县| 昭平县|