Activity是我们学习接触到的第一个组件,也是最重要的组件;也是面试过程中经常被问到的问题;熟练掌握Activity非常必要.
0x01、生命周期:
| 方法名 | 描述 |
|---|---|
| onCreate() | 活动生命周期执行的第一个方法,用户不可见,其中setContentView方法用于解析XML布局 |
| onStart() | Activity已经启动,但还没有显示出来 |
| onResume() | Activity已经启动但还未显示在前台了,当此函数执行完才会显示到前台 |
| onPause() | 当一个弹窗或者其他因素导致活动可见但停止时调用 |
| onStop() | 活动停止且不可见 |
| onDestory() | 活动被销毁 |
| onRestart() | 活动调用onStop停止后重新让活动start时会先调用onRestart方法后调用onStart方法 |
活动的生命周期
0x02、A活动启动B活动,A的onPause先于B的onResume()方法
MainActivity: onPause:
SecondActivity: onCreate:
SecondActivity: onStart:
SecondActivity: onResume:
Activity的启动过程:由ActivityManagerService(AMS)对栈内的Activity状态进行同步管理 &规定:新Activity启动前,栈顶的Activity必须先onPause(),才能启动新的Activity执行onResume()[1]
此处应该有ActivityManagerService的源码部分及分析,但是时间紧急,留个坑,后面完成。
0x03、以屏幕旋转为例的异常生命周期
当我们的安卓项目没有在AndroidManifest.xml中做如下配置时,我们每一次旋转屏幕,都会导致活动被重启;
<activity android:name=".MainActivity"
android:configChanges="orientation|keyboardHidden|screenSize">
他分别执行:
'''
onPause:
onSaveInstanceState:
onStop:
onDestroy:
onCreate:
onStart:
onRestoreInstanceState:
onResume:
'''
总结:一句话,先暂停再保存数据,而后先恢复数据,再resume
无论配置了什么,屏幕旋转总会去执行onConfigurationChanged方法
0x04、四种启动模式
a、Standard
无论当前活动是否在栈顶,都会去重新启动一个活动,会执行onCreate方法,onStart和onResume方法
b、SingleTop
当且仅当当前活动在任务栈的栈顶时,活动会被复用,否则就创建活动,原活动入栈
c、SingleTask
当任务栈里面有当前活动的实例,那么就把这个栈上面的活动释放出栈。然当前活动回到栈顶
d、SingleInstance
单独运行在一个返回栈里面,用于其他程序调用。
有个例子
A,B是standard启动模式,C是singleInstance启动模式,A启动C, C启动B,B点返回,怎么退出?
首先B返回不会直接返回到C,而是当前栈先出栈,所以返回到A,A返回,当前栈里 A出栈,栈空,则返回到C所在的栈,C出栈,所有栈空,程序结束。
参考资料
[1] 作者:Carson_Ho 链接:https://www.jianshu.com/p/b1ff03a7bb1f












网友评论