Activity生命周期详解及注意事项

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/fengluoye2012/article/details/79717113
简介
 Activity是Android app的重要组成部分,用户可与其提供的屏幕进行交互,以执行拨打电话、拍摄照片、发送电子邮件或查看地图等操作。每个Activity都会获得一个用于绘制其用户界面的窗口。窗口通常会充满屏幕,但也可小于屏幕并浮动在其他窗口之上。

 一个应用通常由多个彼此松散联系的Activity组成。一般会指定应用中的某个Activity为“主”Activity,即首次启动应用时呈现给用户的那个Activity。而且每个Activity均可启动另一个Activity,以便执行不同的操作。每次新Activity启动时,前一Activity便会停止,但系统会在堆栈(“返回栈”)中保留该Activity。当新Activity启动时,系统会将其推送到返回栈上,并取得用户焦点。返回栈遵循基本的“后进先出”(FILO)堆栈机制,因此,当用户完成当前Activity并按“返回”按钮时,系统会从堆栈中将其弹出(并销毁),然后恢复前一Activity。

Activity的三种状态
1:运行中: 此 Activity 位于屏幕前台并具有用户焦点。对应生命周期onResume()。
2:暂停: 另一个 Activity 位于屏幕前台并具有用户焦点,但此 Activity 仍可见。也就是说,另一个 Activity 显示在此 Activity 上方,并且该 Activity 部分透明或未覆盖整个屏幕。 暂停的 Activity 处于完全活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,并与窗口管理器保持连接),但在内存极度不足的情况下,可能会被系统终止。对应生命周期onPause()。
3:停止状态: 该 Activity 被另一个 Activity 完全遮盖(该 Activity 目前位于“后台”)。 已停止的 Activity 同样仍处于活动状态(Activity 对象保留在内存中,它保留了所有状态和成员信息,但与窗口管理器连接)。 不过,它对用户不再可见,在他处需要内存时可能会被系统终止。对应生命周期onStop()。

Activity生命周期
1:Activity的整个生命周期发生在onCreate()调用与onDestroy()调用之间。Activity应在onCreate()中执行“全局”状态设置(例如通过setContentView()定义布局),并释放onDestroy()中的所有其余资源。例如,如果您的Activity有一个在后台运行的线程,用于从网络上下载数据,它可能会在onCreate()中创建该线程,然后在onDestroy()中停止该线程。

2:Activity的可见生命周期发生在onStart()调用与onStop()调用之间。在这段时间,用户可以在屏幕上看到Activity并与其交互。例如,当一个新Activity启动,并且此Activity不再可见时,系统会调用onStop()。您可以在调用这两个方法之间保留向用户显示Activity所需的资源。例如,您可以在onStart()中注册一个BroadcastReceiver以监控影响UI的变化,并在用户无法再看到您显示的内容时在onStop()中将其取消注册。在Activity的整个生命周期,当Activity在对用户可见和隐藏两种状态中交替变化时,系统可能会多次调用onStart()和onStop()。

3:Activity的前台生命周期发生在onResume()调用与onPause()调用之间。在这段时间,Activity位于屏幕上的所有其他Activity之前,并具有用户输入焦点。Activity可频繁转入和转出前台;例如,当设备转入休眠状态或出现对话框时,系统会调用onPause()。由于此状态可能经常发生转变,因此这两个方法中应采用适度轻量级的代码,以避免因转变速度慢而让用户等待。

上图:说明了这些循环以及Activity在状态转变期间可能经过的路径。矩形表示回调方法,当Activity在不同状态之间转变时,您可以实现这些方法来执行操作。带颜色的矩形表示Activity的状态。

生命周期回调详解
1:onCreate():首次创建Activity时调用。您应该在此方法中执行所有正常的静态设置、创建视图、将数据绑定到列表等等。系统向此方法传递一个Bundle对象,其中包含Activity的上一状态,不过前提是捕获了该状态。始终后接onStart()
2:onStart():在Activity即将对用户可见之前调用。如果Activity转入前台,则后接onResume(),如果Activity转入隐藏状态,则后接onStop()
3:onResume():在Activity即将开始与用户进行交互之前调用。此时,Activity处于Activity堆栈的顶层,并具有用户输入焦点。始终后接onPause()
4:onPause():当系统即将开始继续另一个Activity时调用。此方法通常用于确认对持久性数据的未保存更改、停止动画以及其他可能消耗CPU的内容,诸如此类。它应该非常迅速地执行所需操作,因为它返回后,下一个Activity才能继续执行。如果Activity返回前台,则后接onResume(),如果Activity转入对用户不可见状态,则后接onStop()
5:onStop():在Activity对用户不再可见时调用。如果Activity被销毁,或另一个Activity(一个现有Activity或新Activity)继续执行并将其覆盖,就可能发生这种情况。如果Activity恢复与用户的交互,则后接onRestart(),如果Activity被销毁,则后接onDestroy()
6:onDestory():在Activity被销毁前调用。这是Activity将收到的最后调用。当Activity结束(有人对Activity调用了finish()),或系统为节省空间而暂时销毁该Activity实例时,可能会调用它。您可以通过isFinishing()方法区分这两种情形。
7:onRestart():在Activity已停止并即将再次启动前调用。始终后接onStart()。

注意:
一:Activity对用户来说,什么时候是可见状态?
Activity生命周期中,onCreate,onStart, onResume, 都不是真正visible的时间点,真正的visible时间点是onWindowFocusChanged()函数被执行时。
onWindowFocusChanged():当前Activity获得焦点或者失去焦点时调用,是最好的标识来区别当前Activity对用户是否可见;
onAttachedToWindow(): 当与Activity关联的主窗口被附加到窗口管理器时调用,在onResume()之后调用。
onDetachedFromWindow():当与Activity关联的主窗口与窗口管理器分离时调用,在onDestory()之后调用。

当一个Activity A被启动后,方法调用顺序:onCreate() -- onStart() -- onResume() -- onAttachedToWindow() -- onWindowFocusChanged:true;
在当Activity A启动Activity B,Activity A的方法调用顺序:onWindowFocusChanged:false -- onPause -- onStop;

在Activity调用onDestory()方法之后,才调用onDetachedFromWindow();

Activity生命周期的切换
问题一当两个Activity位于同一进程,Activity A启动Activity B,Activity A和B的生命周期回调?以及执行的先后顺序? 如果点击Back返回键之后,Activity A和B的生命周期变化?
以下是当ActivityA启动ActivityB时一系列操作的发生顺序:
  1. Activity A的onPause()方法执行。
  2. Activity B的onCreate()、onStart()和onResume()方法依次执行。(Activity B现在具有用户焦点。)
  3. 然后,如果Activity A在屏幕上不再可见,则其onStop()方法执行。
点击Back返回键之后,ActivityB 和Activity A的生命周期执行顺序:
  1. Activity B的 onPause()方法执行。
  2. Activity A的 onRestart(),onStart(),onResume()方法执行。
  3. Activity B的 onStop()方法执行。
可以利用这种可预测的生命周期回调顺序管理从一个 Activity 到另一个 Activity 的信息转变。 例如,如果您必须在第一个 Activity 停止时向数据库写入数据,以便下一个 Activity 能够读取该数据,则应在 onPause() 而不是 onStop() 执行期间向数据库写入数据。

问题二:当前Activity A可见,按Home键回到桌面,Activity A的生命周期执行顺序?点击APP图标再次打开APP,生命周期的执行顺序?
1:点击Home键之后,Activity A依次执行onPause(),onStop();
2:如果再次点击APP运行依次执行onRestart(),onStart(),onResume()方法。

问题三:当前Activity A可见,锁屏,Activity A的生命周期执行顺序?解锁之后,Activity的生命周期?
1:锁屏之后,Activity A依次执行onPause(),onStop();
2:解锁之后,Activity A依次执行onRestart(),onStart(),onResume();

问题四:当前Activity的launchMode="singleTask",并且已经在栈顶的情况下,再次启动当前Activity时,生命周期的变化?如果不在栈顶,生命周期又如何变化呢?

1:在栈顶的情况下:onPause--onNewIntent--onResume;

2:不在栈顶的情况下:onNewIntent -- onRestart--onStart -- onResume;

参考文档
《google官网文档》

猜你喜欢

转载自blog.csdn.net/fengluoye2012/article/details/79717113