- 《Android自定义View之Activity页面的组成》
- 《Android Activity——启动过程探索(一)》
- 《Android Activity——启动过程探索(二)》
- 《Android Activity——启动过程探索(三)》
- 《Activity 启动模式及任务栈探究》
- 《Activity常见问题》
Activity常见问题
通过这篇博客,我们能知道以下问题:
Activity
各种情况下的生命周期- 弹出
Dialog
对Activity
生命周期有什么影响? onActivityResult()
在哪两个生命周期之间回调?Activity
在onResume()
之后才显示的原因是什么?- 通过 Sheme 协议打开
Activity
Activity
什么时候会发生重建?- 在
Activity
的onCreate()
方法里写死循环会 ANR 吗?
1. Activity 生命周期方法相关
生命周期的回调方法
Activity生命周期的回调主要有 onCreate()
、onRestart()
、onStart()
、onResume()
、onPause()
、onStop()
、onDestory()
几个方法。
调用时机说明:
onCreate()
:系统创建Activity
时触发,用来初始化 Activity 的基本组件。onRestart()
:当处于“已停止”状态的Activity
即将重启时,系统就会调用此回调。onStart()
:Activity
将进入“已启动”状态,并对用户可见。onResume()
:系统会在Activity
开始与用户互动之前调用此回调。此时,该Activity
位于Activity
堆栈的顶部,并会捕获所有用户输入onPause()
:当Activity
失去焦点并进入“已暂停”状态时,系统就会调用此回调。onStop()
:当Activity
对用户不再可见时,系统就会调用此回调。onDestory()
:系统会在销毁Activity
之前调用此回调。此回调是Activity
接收的最后一个回调。通常,实现onDestroy()
是为了确保该Activity
的所有资源。
onStart()
和 onStop()
是从 Activity
是否可见来回调的,onResume()
和 onPause()
是从 Activity
是否位于前台来回调的。
在生命周期里几种状态:
-
Activity
的整个生命周期发生在onCreate()
与onDestroy()
之间,在onCreate()
中执行“全局”状态设置(例如状态布局),并在onDestroy()
中释放资源。 -
Activity
的可见生命周期发生在onStart()
与onStop()
之间,在这段时间内Activity
对用户可见。在整个生命周期中,当 Activity 在对用户可见和隐藏俩种状态中交替变化时,系统会多次调用onStart()
和onStop()
。 -
Activity
的前台生命周期发生在onResume()
与onPause()
之间,Activity
位于其他Activity
之前(栈顶位置),可与用户交互并具有输入焦点。但状态改变频繁,系统会多次调用onResume()
和onPause()
,建议做些轻量级操作。
打开Activity时两个Activity的生命周期方法的回调顺序
当一个 Activity
启动另一个 Activity
时,它们都会经历生命周期转换。第一个 Activity
停止运行并进入“已暂停”或“已停止”状态,同时创建另一个 Activity
。
-
Activity
A 启动Activity
B,BActivity
的launchMode
为standard
或者 BActivity
没有可复用的实例时: A.onPause()
-> B.onCreate()
-> B.onStart()
-> B.onResume()
-> A.onStop()
--> A.onDestory()
(如果需要关闭Activity A[A 被移出栈]) -
Activity
A 启动Activity
B,BActivity
的launchMode
为singleTop
且 BActivity
已经在栈顶时(一些特殊情况如通知栏点击、连点、BActivity
自己打开自己),此时只有 B 页面自己有生命周期变化:B.onPause()
-> B.onNewIntent()
-> B.onResume()
-
当 B
Activity
的launchMode
为singleInstance
,singleTask
且对应的 BActivity
有可复用的实例时:A.onPause()
-> B.onNewIntent()
-> B.onRestart()
-> B.onStart()
-> B.onResume()
-> A.onStop()
--> A.onDestory()
(如果需要关闭Activity A[A 被移出栈]) -
当 B
Activity
的Theme
为Dialog
时:A.onPause()
-> B.onCreate()
-> B.onStart()
-> B.