注册

复习Activity各种场景的生命周期

Activity是Android组件中最基本也是最为常见用的四大组件之一,也是我们在开发过程之中接触最多的组件,所以了解Activity的生命周期,并正确的理解与应用,是必不可少的。之前看到很多错误文章,今天特意自己亲自测试一遍,下面就来介绍一下Activity生命周期。

一.官网生命周期

在这里插入图片描述 上面图概括了android生命周期的各个环节,描述了activity从生成到销毁的过程。

  • onCreate:该方法时整个Activity生命周期的第一个方法,它表示Activity正在被创建,日常开发过程中,相信大家接触最多的就是这个方法,在这个方法中我们常常做一些初始化的工作(如加载布局资源、初始化数据等操作),此时Activity不可见。

  • onStart:顾名思义,该方法代表Activity正在被启动,此时Activity已经可见,但是无法响应用户的交互动作。

  • onResume:该方法表示Activity已经经过前面步骤创建完成,此时Activity已经可见并且已经来前台,用户能够看到界面并且能够进行交互操作并获得响应。

  • onPause:onPause方法表示Activity正在暂停,正常情况下,onStop紧接着就会被调用。在特殊情况下,如果这个时候用户快速地再回到当前的Activity,那么onResume会被调用(希望你手速够快,很难出现)。一般来说,在这个生命周期状态下,可以做一些存储数据、停止动画的工作,但是该方法不能执行耗时操作,这是由于启动新的Activity而唤醒的该状态,那会影响到新Activity的启动,原因是新的Activity的onResume方法是在老Activity的onPause执行完后才执行的(具体原因可以看下系统启动Activity的机制)。

  • onStop:表示Activity即将停止,可以做一些稍微重量级的资源回收工作等,同样也不能太耗时。

  • onDestroy:表示Activity即将被销毁,这是Activity生命周期的最后一个回调,我们可以做一些回收工作和最终的资源释放(如Service、BroadReceiver、Map等)。

  • onRestart:表示Activity正在重新启动,一般情况下,在当前Activity从不可见重新变为可见的状态时onRestart就会被调用。这种情形一般是由于用户的行为所导致的,比如用户按下Home键切换到桌面或者打开了一个新的Activity(这时当前Activity会暂停,也就是onPause和onStop被执行),接着用户有回到了这个Activity,就会出现这种情况。

二.常见一些情景

1.直接启动一个MainActivity

MainActivity: onCreate
MainActivity: onStart
MainActivity: onResume

2.在MainActivity中启动TwoActivity

此时MainActivity中先执行onPause方法,然后 TwoActivity执行onCreate → onStart → onResume,TwoActivity完全显示后才会执行MainActivity的 onStop方法

MainActivity: onPause
TwoActivity: onCreate
TwoActivity: onStart
TwoActivity: onResume
MainActivity: onStop

3.TwoActivity中点击back返回

此时TwoActivity 先执行 onPause方法,MainActivity执行onRestart→ onStart → onResume,最后TwoActivity 执行onStop→ onDestroy

TwoActivity: onPause
MainActivity: onRestart
MainActivity: onStart
MainActivity: onResume
TwoActivity: onStop
TwoActivity: onDestroy

3.MainActivity中点击home或者锁屏按键

MainActivity: onPause
MainActivity: onStop

4.重新进入MainActivity

MainActivity: onRestart
MainActivity: onStart
MainActivity: onResume

5.MainActivity 点击弹窗dialog

  • 注意:之前被很多人误导有生命周期变化,真实测试后发现没变化
**** 无生命周期变化 ****  
**** 无生命周期变化 ****
**** 无生命周期变化 ****

6.MainActivity 点击跳转透明Activity

设置透明activity的方法可以通过style

  <style name="MyTransparent" parent="Theme.AppCompat.Light.NoActionBar">
<item name="android:windowIsTranslucent">true</item>
<item name="android:windowAnimationStyle">@android:style/Animation.Translucent</item>
<item name="android:windowBackground">@android:color/transparent</item>
<item name="android:colorBackgroundCacheHint">@null</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowContentOverlay">@null</item>
</style>

发现跳转到透明TransActivity后MainActivity并没有执行onstop方法

MainActivity: onPause
TransActivity: onCreate
TransActivity: onStart
TransActivity: onResume

7.透明Activity点击返回

MainActivity直接就执行了onResume方法

TransActivity: onPause
MainActivity: onResume
TransActivity: onStop
TransActivity: onDestroy

8.透明Activity中点击home或者锁屏按键

发现TransActivity和MainActivity都调用了onStop方法

TransActivity: onPause
TransActivity: onStop
MainActivity: onStop

9.重新进入透明Activity

发现MainActivity也执行了onRestart → onStart

MainActivity: onRestart
MainActivity: onStart
TransActivity: onRestart
TransActivity: onStart
TransActivity: onResume

三.Activity中onSaveInstanceState()和onRestoreInstanceState()

1.onSaveInstanceState(Bundle outState):

onSaveInstanceState函数在Activity生命周期中执行。 outState 参数作用 : 数据保存 : Activity 声明周期结束的时候, 需要保存 Activity 状态的时候, 会将要保存的数据使用键值对的形式 保存在 Bundle 对象中;

调用时机 : Activity 被销毁的时候调用, 也可能没有销毁就调用了; 按下Home键 : Activity 进入了后台, 此时会调用该方法; 按下电源键 : 屏幕关闭, Activity 进入后台; 启动其它 Activity : Activity 被压入了任务栈的栈底; 横竖屏切换 : 会销毁当前 Activity 并重新创建;

onSaveInstanceState方法调用注意事项 : 用户主动销毁不会调用 : 当用户点击回退键 或者 调用了 finish() 方法, 不会调用该方法; 调用时机不固定 : 该方法一定是在 onStop() 方法之前调用, 但是不确定是在 onPause() 方法之前 还是 之后调用; 布局中组件状态存储 : 每个组件都 实现了 onSaveInstance() 方法, 在调用函数的时候, 会自动保存组件的状态, 注意, 只有有 id 的组件才会保存; 关于默认的 super.onSaveInstanceState(outState) : 该默认的方法是实现 组件状态保存的;

MainActivity按电源键进入后台的生命周期如下:

MainActivity: onPause
MainActivity: onStop
MainActivity: onSaveInstanceState

2.onRestoreInstanceState(Bundle outState):

方法回调时机 : 在 Activity 被系统销毁之后 恢复 Activity 时被调用, 只有销毁了之后重建的时候才调用, 如果内存充足, 系统没有销毁这个 Activity, 就不需要调用; – Bundle 对象传递 : 该方法保存的 Bundle 对象在 Activity 恢复的时候也会通过参数传递到 onCreate() 方法中;

四.activity的进程优先级。

前台进程>可见进程>service进程>后台进程>空进程

前台进程:

 1.当前进程activity正在与用户进行交互。
2.当前进程service正在与activity进行交互或者当前service调用了startForground()属于前台进程或者当前service正在执行生命周期(onCreate(),onStart(),onDestory())
3.进程持有一个BroadcostReceiver,这个BroadcostReceiver正在执行onReceive()方法

可见进程:

 1. 进程持有一个activity,这个activity不再前台,处于onPause()状态下,当前覆盖的activity是以dialog形式存在的。
2. 进程有一个service,这个service和一个可见的Activity进行绑定。

service进程:

 1.当前开启startSerice()启动一个service服务就可以认为进程是一个服务进程。

后台进程:

  activity的onStop()被调用,但是onDestroy()没有调用的状态。该进程属于后台进程。

空进程

 改进程没有任何运行的数据了,且保留在内存空间,并没有被系统killed,属于空进程。该进程很容易被杀死。

0 个评论

要回复文章请先登录注册