- Android Jetpack开发:原理解析与应用实战
- 黄林晴
- 669字
- 2022-07-05 09:43:56
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所示。
图2-1 运行日志
再次运行程序,在第3秒时,点击跳过广告,运行日志如图2-2所示。
图2-2 跳过广告运行日志
这样就实现了广告引导页的需求,但是这种实现方式不够优雅,因为开发者需要在Activity对应生命周期的方法中主动执行相关的方法,当与生命周期相关联的方法越来越多时,业务的改动就会导致Activity层的处理逻辑难以维护,那么有没有什么办法可以让管理类主动执行Activity对应生命周期的方法呢?这就是本章要认识的第一个Jetpack组件——Lifecycle。