2020.8.5
学完界面之间的两种跳转模式后,便可实现下面这个demo
在体验该项目的过程中,发现有一个bug,就是当你由竖屏转换成横屏时,屏幕上的数据会消失,回到了该页面起始的状态,其本质是因为横竖屏的转换会导致生命周期重新开始,下面将详细讲解Activity的生命周期
一.日志打印
在程序找bug的时候,我们通常会选择在终端打印信息,但无论在模拟器上运行还是真机,终端会输出很多无关信息,所以println()的方式不太方便查找,此时便使用日志打印,其优点是可以对你想要的信息进行筛选
使用步骤:
- 调用格式:Log.v("进行筛选的标志","打印内容")
- 在Logcat中进行筛选
打印信息的几种类型:
Log.v() -> Verbose
Log.d() -> Debug
Log.i() -> Info
Log.e -> Eorror
Log.w -> Warn
当然最常用的还是Log.v()
二.生命周期
Activity生命周期:从创建->界面销毁 经历的过程
生命周期环节 | 何时发生调用 |
---|---|
onCreate | 当Activity被创建,需要对界面进行布局/初始化 |
onStart | 开始启动页面 |
onRestart | 重新启动,从后台到前台 |
onResume | 可以进行交互了 |
onPause | 暂停交互 |
onStop | 界面暂停 |
onDestroy | 界面销毁 |
了解app几种操作经历的生命周期
- 程序第一次启动
onCreate
onStart
onResume
处于可以进行交互的状态
- 程序切换到后台
onPause
onStop
- 程序从后台切换到前台并显示
onRestart
onStart
onResume
- 按返回键
onPause
onStop
onDestroy
当前界面会被释放掉
- 切换到其他页面
onPause
onStop
- 从其他页面切换回来
onRestart
onStart
onResume
- 屏幕旋转
onPause
onStop
onDestroy
onCreate
onStart
onResume
屏幕旋转时,会销毁当前页面,重新加载页面,因而之前存的值都会消失
为了解决这个问题,我们需要在界面旋转之前将textView上的文本内容进行保存,系统专门提供了一个方法onSaveInstanceState(outState: Bundle)
存值:outState用来管理键值对,在界面旋转前会回调这个方法进行存值
取值:当调用onCreate时,需要将值取出来传给textView,这样给用户的感觉是,值一直都在,之所以会在onCreate中取值,因为onCreate的参数
onCreate(savedInstanceState: Bundle?),savedInstanceState会一直伴随整个过程,当然存的值也在里面
取值
override fun onCreate(savedInstanceState: Bundle?) {
savedInstanceState?.getString("content").also {
textView.text=it
}
}
存值
override fun onSaveInstanceState(outState: Bundle) {
super.onSaveInstanceState(outState)
outState.putString("content",textView.text.toString())
}
总结:了解生命周期各个阶段在什么时候发生在很多时候都特别有用,比如界面间的来回切换,我们希望返回界面时展示其他图片等,可以用一个值来进行记录,在调用onCreate方法时进行读取判断该值的状态,还是挺有帮助的,因而生命周期的应用主要是Activity的状态改变上
三.Lifecycle
虽然我们可以像上面那样直接在onCreate的方法中实现该阶段应该实现的功能,但这种方式不易于维护,比如高德地图,当我们启动应用的时候,它就会开始获取定位信息,当我们回到桌面即让它进入任务栈,那么就应该停止获取定位信息,完全退出时,应该进行回收资源,但我们有的时候需要对它们进行阶段修改,本来应该在onStop中调用,现在想让它在onPause中调用,如果代码量过多的话,修改起来就很麻烦,所以为了便于维护,我们使用Lifecycle,其内部是通过注解自动感应Activity的生命周期,如果要修改,只需要修改对应的注解即可,方便太多
- 如果要让一个类自动感应生命周期,则它必须实现LifecycleObserver这一接口,该接口内部没有任何方法,只是用来感知生命周期的改变,它作为观察者
- 同时Activity也需要添加观察者的对象 lifecycle.addObserver(GaoDe())
每个Activity内部都有一个lifecycle,Activity作为被观察者 - 使用方式 @OnLifecycleEvent(Lifecycle.Event.生命周期的阶段)
这里的生命周期只是静态常量,和上面的用法一样,只是形式不同 - 当被观察者的生命周期发生变化时,会主动去观察者中查询是否有观察这个生命周期,通过注解实现,注解值和生命周期各阶段一一对应
class GaoDe:LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun init(){
Log.v("cx","初始化地图信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun connect(){
Log.v("cx","开始连接获取定位信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun disconnect(){
Log.v("cx","停止获取定位信息")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun recycle(){
Log.v("cx","回收资源")
}
}