Android开发——界面跳转实战引出生命周期

2020.8.5

学完界面之间的两种跳转模式后,便可实现下面这个demo

demo演示.gif

在体验该项目的过程中,发现有一个bug,就是当你由竖屏转换成横屏时,屏幕上的数据会消失,回到了该页面起始的状态,其本质是因为横竖屏的转换会导致生命周期重新开始,下面将详细讲解Activity的生命周期

一.日志打印

在程序找bug的时候,我们通常会选择在终端打印信息,但无论在模拟器上运行还是真机,终端会输出很多无关信息,所以println()的方式不太方便查找,此时便使用日志打印,其优点是可以对你想要的信息进行筛选

使用步骤:

  1. 调用格式:Log.v("进行筛选的标志","打印内容")
  2. 在Logcat中进行筛选
Logcat.png

打印信息的几种类型:
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几种操作经历的生命周期
  1. 程序第一次启动
    onCreate
    onStart
    onResume
    处于可以进行交互的状态
首次启动app.gif
  1. 程序切换到后台
    onPause
    onStop
大返回(home键).gif
  1. 程序从后台切换到前台并显示
    onRestart
    onStart
    onResume
后台回到app.gif
  1. 按返回键
    onPause
    onStop
    onDestroy
    当前界面会被释放掉
返回到桌面.gif
  1. 切换到其他页面
    onPause
    onStop
跳转到其他页面.gif
  1. 从其他页面切换回来
    onRestart
    onStart
    onResume
从其他页面切换回来.gif
  1. 屏幕旋转
    onPause
    onStop
    onDestroy
    onCreate
    onStart
    onResume
屏幕旋转.gif

屏幕旋转时,会销毁当前页面,重新加载页面,因而之前存的值都会消失


旋转问题.gif

为了解决这个问题,我们需要在界面旋转之前将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","回收资源")
    }
}

你可能感兴趣的:(Android开发——界面跳转实战引出生命周期)