Activity知识梳理
Activity知识梳理
1. Activity生命周期
Activity是由Activity栈进管理,当启动一个新的Activity后,此Activity将被加入到Activity栈顶并处于运行状态,之前的Activity在栈中位于此Activity底部并且不会出现在前台除非新Activity退出。Acitivity一般意义上有四种状态:
- 当Activity位于栈顶时,此时正好处于屏幕最前方,此时处于
运行状态
; - 当Activity失去了焦点但仍然对用于可见
(如栈顶的Activity是透明的或者栈顶Activity并不是铺满整个手机屏幕)
,此时处于暂停状态
。这个状态的Activity仍然存活,当系统的内存极低的时候它会被杀死。 - 当Activity被其他Activity
完全遮挡
,此时此Activity对用户不可见,此时处于停止状态
。这个时候它仍然保留着所有的状态和成员信息,然而,它对用户来说不再可见
,所以它的窗口被隐藏,当需要在其他地方使用内存时,它常常被系统杀死。 - 当Activity由于人为或系统原因(如低内存等)被销毁,此时处于
销毁状态
;
官方图
图中需要注意一下几点:
1.Activity实例是由系统自动创建,并在不同的状态期间回调相应的方法。一个最简单的完整的Activity生命周期会按照如下顺序回调:onCreate -> onStart -> onResume -> onPause -> onStop -> onDestroy。称之为entire lifetime
。
2.当执行onStart回调方法时,Activity开始被用户所见(也就是说,onCreate时用户是看不到此Activity的,那用户看到的是哪个?当然是此Activity之前的那个Activity),一直到onStop之前,此阶段Activity都是被用户可见,称之为visible lifetime
。
3.当执行到onResume回调方法时,Activity可以响应用户交互,一直到onPause方法之前,此阶段Activity称之为foreground lifetime
。
示例与QA
假设有两个Activity,A和B。
情况一 AB都不是透明的
启动A,开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。
当用户点击A中按钮来到B时,假设B全部遮挡住了A,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume -> A:onStop。
此时如果点击Back键,将依次执行B:onPause -> A:onRestart -> A:onStart -> A:onResume -> B:onStop -> B:onDestroy。
情况二 B不是透明的
启动A,开始时,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。
当用户点击A中按钮来到B时,,将依次执行A:onPause -> B:onCreate -> B:onStart -> B:onResume 。
此时如果点击Back键,将依次执行B:onPause -> A:onResume -> B:onStop -> B:onDestroy。
情况三 在A已经位于栈顶的时候弹出Dialog
- 启动Dialog的主题是默认的。
启动A,A被实例化,执行的回调有A:onCreate -> A:onStart -> A:onResume。当在A是中弹出Dialog时,A的生命周期不会有任何变化。 - 启动Dialog的主题是Activity的。 待测
情况四 在A已经位于栈顶的时候弹出PopWindow
没任何影响
情况五 横竖屏切换时候的生命周期
此处必须设置screenSize
的原文在这里
Q:onSaveInstanceState何时会调用?
只有在Activity异常终止的时候才会调用,也可以说是Activity即将被销毁并且有机会重新显示的情况下才会调用。
会触发的情况
- Activity启动一个新的Activity的时候
- Home键
- Menu键
- 锁屏
- 用户旋转屏幕(
API>13且没有设置orientation|screenSize
)。
不会触发的情况
- 用户按Back键不会触发,
onRestoreInstanceState
不一定会和onSaveInstanceState
成对出现。
Q:如何避免配置改变时Activity重建?
- API<13设置configChanges=”orientation”或configChanges=”orientation|keyboardHidden”
- API>13设置configChanges=”orientation|screenSize”
Q:优先级低的Activity在内存不足被回收后怎样做可以恢复到销毁前状态?
A: Activity被回收后可以在onCreate中的Bundle中判断是否有值来恢复数据。也可以在onRestoreInstanceState中恢复。
Q:说下Activity的四种启动模式?
(adb shell dumpsys activity 可以查看栈中的Activity)
standard
标准模式。一个任务栈中可以有多个实例,每个实例也可以属于不同的任务栈。谁启动了这个Activity,这个Activity就运行在它的那个任务栈中。
singleTop
栈顶复用模式。如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,同时会回调它的onNewIntent方法。
singleTask
栈内复用模式。只要Activity在一个栈中存在,那么多次启动此Activity都不会重新创建实例,也会回调onNewIntent方法。比如Activity A,系统会首先寻找是否存在A想要的任务栈。如果不存在,就重新创建一个任务栈,然后创建A的实例后把A放入栈中。如果存在,看是否有A的实例在栈中存在。如果存在,系统会把A调到栈顶并调用它的onNewIntent方法,如果实例不存在,就创建A的实例并把A压入栈中。
singleTask具有clearTop的效果。
singleInstance
单实例模式。具有singleTask的所有特性。具有此种模式的Activity只能单独地位于一个任务栈中。
Q:谈谈singleTop和singleTask的区别以及应用场景
singleTop
- 处理通知
singleTask
- 浏览器
- 微信小程序
Q:onNewIntent()调用时机?
- 启动一个SingleTop且位于栈顶的Activity的时候
- 启动一个SingleTask且位于栈内的Activity的时候
Q:了解哪些Activity启动模式的标记位?
设定Activity启动模式的标记位
设定Activity运行状态的标记位
Q:如何启动其他应用的Activity?
用隐式意图启动Activity