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","回收资源")
    }
}
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,470评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,393评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,577评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,176评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,189评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,155评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,041评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,903评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,319评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,539评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,703评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,417评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,013评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,664评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,818评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,711评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,601评论 2 353