Android开发Activity生命周期详解

本文详解Android开发Activity生命周期。

目录

一、Activity

二、Activity生命周期

三、生命周期特性

四、常见情况生命周期的执行顺序


一、Activity

Activity是用户交互的第一接口,它提供了一个用户完成指令的窗口。当开发者创建Activity之后,通过setContentView(View)方法来给该Activity指定一个显示的界面,并以为基础提供给用户交互的接口。系统采用Activity栈的方式来管理Activity。

Activity由任务栈管理。启动一个新的Activity后,该Activity将被加入到任务栈栈顶,之前的Activity位于此Activity底部。

 Activity一个最大的特点就是拥有多种形态,它可以在多种形态间进行切换,以此来控制自己的生命周期。

Acitivity一般有四种状态:

①运行状态: Activity位于栈顶,此时正好处于屏幕最前方。(可见可交互)

②暂停状态:Activity失去了焦点,但仍然对用户可见(如栈顶的Activity是透明的或栈顶Activity并不是铺满整个手机屏幕)。可以在极低内存情况下被系统杀死。(可见不可交互)

③停止状态:当Activity被其他Activity完全遮挡,此时此Activity对用户不可见。它仍然保留所有状态和成员信息,但是它不再对用户可见,因此其窗口被隐藏,并且当其他地方需要内存时,它通常会被系统杀死。(不可见,不可交互)

④销毁状态:如果Activity在栈区中被移除后,当它再次显示给用户时必须完全重新启动并恢复到之前的状态。

在每个不同的状态阶段,Android系统会对Activity内相应的方法进行回调。因此写Activity时一般都是继承Activity类并重写相应的回调方法。

二、Activity生命周期

onCreate:创建活动。把页面布局加载进内存,进入了初始状态。

onStart:开始活动。把活动页面显示在屏幕上,进入了就绪状态。

onResume:恢复活动。活动页面进入活跃状态,能够与用户正常交互,例如允许响应用户的点击

动作、允许用户输入文字等等。

onPause:暂停活动。页面进入暂停状态,无法与用户正常交互

onStop:停止活动。页面将不在屏幕上显示。

onDestroy:销毁活动。回收活动占用的系统资源,把页面从内存中清除。

onRestart:重启活动。重新加载内存中的页面数据

onNewIntent:重用已有的活动实例。

三、生命周期特性

onCreate

特性:

onCreate是Activity创建时的第一个生命周期,并且只会执行一次

onCreate执行时Activity处于不可见状态

在这个方法中我们会初始化当前布局setContentLayout()方法

onCreate执行时Activity的View并没有测量尺寸绘制,这个时候View的宽高值为0。

建议:

不建议进行耗时初始化

建议只需要进行只需要一次初始化的View的初始化,比如View的初始化,对话框的初始化,ViewModel的初始化

获取Intent里传入的值

onStart

特性:

onCreate()方法完成后,此时activity进入onStart()方法

当前activity是用户可见状态,但没有焦点,与用户不能交互,一般可在当前方法做一些动画的初始化操作。

可以被onRestart重新调用

建议:

不建议进行耗时初始化

View的动画初始化与开启

一些需要在后台暂停后又重新恢复的初始化,比如一些包含操作View的Handler的重新初始化

视频播放与相机拍照等等功能的重新初始化(比如:Camera2、VideoView)

onResume

特性:

onStart()方法完成之后,此时activity进入onResume()方法中

当前activity状态属于运行状态 (Running),可与用户进行交互

建议:

在重新运行onResume情况下,可以考虑重新恢复视频播放,注意只是将暂停播放的视频后的重新恢复。并不是重新初始化视频播放组件

可以考虑Camera预览可以在这里开启。

在重新运行onResume情况下,恢复Camera预览。

可以考虑动画在这里开启。

在重新运行onResume情况下,恢复一些动画View的动画效果。

在重新运行onResume情况下,恢复需要与操作View有关的Callback或者Listener。

进行超级耗时的初始化与加载,建议显示一个等待对话框。这样页面已经显示了,用户也能看到等待对话框。(但是,因为onResume容易反复调用需要注意需要利用onRestart生命周期做好判断,防止已经初始化过的资源,进行反复耗时初始化)

onPause

特性:

Activity在不在前台时,比如一个Dialog模式的Activity启动后,处于背景半透明置灰的情况的这个Activity也会触发onPause

注意!onPause触发时,Activity可能处于瞬间可见状态,并可以进行焦点操作。

如果是正常快速跳转Activity,在进入下一个Activity的瞬间触发onPause,这个时候在马上按返回键会直接触发onResume(不经过onStart生命周期)。

在这个生命周期里View是还能被操作并且不会报错的。(比如改变TextView的字体颜色,字体大小等等操作)

在启动另外一个Activity时,需要先回调当前前台Activity的onPause生命周期,才能回调需要启动Activity的onCreate() -> onStart() -> onResume(),这就意味着请不要在onPause生命周期里做耗时的操作,否则会让需要前台的Activity有明显的延迟

建议:

暂停视频播放

暂停摄像拍照预览

暂停动画

保存一些需要永久保存的UI值。

保存一些UI的临时值,方便下一次执行onResume的时候恢复显示。比如一些UI单选结果、多选结果,EditText里的内容。

释放与操作View有关的Callback或者Listener

onStop

特性:

 onPouse()方法完成之后,此时activity进入onStop()方法

在此生命周期Activity对用户是不可见的

在系统内存紧张的情况下,有可能会被系统进行回收。所以一般在当前方法可做资源回收。

在这个生命周期下操作View会报错

建议:

假设有Handler需要处理View,那么需要在这个生命周期里移除Handler里的所有待发消息。(handler.removeCallbacksAndMessages(null);)

释放Camera2或者Camera的资源。

释放视频播放VideoView的资源。

需要耗时释放的资源与后台操作建议放到此处进行。

onRestart

特性:

onRestart()方法在用户按下home()之后,再次进入到当前activity的时候调用。调用顺序onPouse()->onStop()->onRestart()->onStart()->onResume().

判断下一个生命周期onStart()是Activity恢复还是首次创建Activity。

建议:

1.增加一些判断给后续onStart或者onResume的生命周期里确定此activity是首次启动还是进入后台恢复的。这样可以避免一些重量级资源重复初始化。

onDestroy

 特性:

Activity被销毁钱最后一个被调用的方法。

Activity不可见。

在这个生命周期下操作View会报错。

这个生命周期并不会在Activity进入后台后马上执行,是否执行释放Activity是交给系统决定的。所以有概率执行onDestroy方法会延后。

建议:

释放一些实例节约空间,如置空List集合、Bean数据等。

操作耗时释放的资源。

置空Handler。

四、常见情况生命周期的执行顺序

第一次启动

onCreate() -> onStart() -> onResume()

从 A 跳转到 B

A_onPause() -> B_onCreate() -> B_onStart() -> B_onResume() -> A_onStop()

从 B 再次回到 A

B_onPause() -> A_onRestart() -> A_onStart() -> A_onResume() -> B_onStop()

用户按 home 键

onPause() -> onStop()

按 home 键后回到应用

onRestart() -> onStart() -> onResume()

用户按电源键屏保

onPause() -> onStop()

用户按电源键亮屏

onRestart() -> onStart() -> onResume()

用户按 back 键回退

onPause() -> onStop() -> onDestroy()

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

未来无限

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值