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。