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

2020.8.5

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

c994c422f003

demo演示.gif

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

一.日志打印

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

使用步骤:

调用格式:Log.v("进行筛选的标志","打印内容")

在Logcat中进行筛选

c994c422f003

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几种操作经历的生命周期

程序第一次启动

onCreate

onStart

onResume

处于可以进行交互的状态

c994c422f003

首次启动app.gif

程序切换到后台

onPause

onStop

c994c422f003

大返回(home键).gif

程序从后台切换到前台并显示

onRestart

onStart

onResume

c994c422f003

后台回到app.gif

按返回键

onPause

onStop

onDestroy

当前界面会被释放掉

c994c422f003

返回到桌面.gif

切换到其他页面

onPause

onStop

c994c422f003

跳转到其他页面.gif

从其他页面切换回来

onRestart

onStart

onResume

c994c422f003

从其他页面切换回来.gif

屏幕旋转

onPause

onStop

onDestroy

onCreate

onStart

onResume

c994c422f003

屏幕旋转.gif

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

c994c422f003

旋转问题.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","回收资源")

}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值