一、Activity的生命周期
关于Activity的生命周期,相信做过Android开发的同学都已经比较熟悉了,一定可以说出个大概,因为Activity的生命周期真的太重要了。不过在开发中,我们在每个生命周期方法应该做些什么,还有一些比较关键的知识细节也许你还不清楚,所以本文会带着大家再来探寻一次Activity的生命周期,启动模式,启动流程,并在文后罗列一些常见的面试题作为思考和回顾。
Activity生命周期的回调意义,可参考下图:
下面简单介绍一下Activity的生命周期:
1、onCreate和onDestory
分别代表了一个Activity的创建和销毁、第一个生命周期和最后一个生命周期回调,期间包裹了一个完整(entire lifetime)的Activity生命周期。
2、onStart和onStop
分别代表了Activity已经处于可见状态和不可见状态,此时的Activity未处在前台,不可以与用户交互,可多次被调用,期间Activity处于可见(visable lifetime)状态。
3、onResume()和onPause()
分别代表了Activity已经进入前台获得焦点和退出前台失去焦点,此时的Activity是可以和用户交互的,可多次被调用,期间的Activity处于前台(foreground lifetime)状态。
4、onRestart()表示Activity正在重新启动,正常状态下,Acitivty调用了onPause--onStop但是并没有被销毁,重新显示此Activity时,onRestart会被调用。
二、Activity的启动模式及应用场景
我们每次打开一个新的Activity或者退出当前Activity都会在一个称为任务栈的结构中添加或者减少一个Activity组件,一个任务栈包含了一个activity的集合。android通过ActivityRecord、TaskRecord、ActivityStack,ActivityStackSupervisor,ProcessRecord有序地管理每个activity。
1、Standard
默认模式,每次启动Activity都会创建一个新的Activity实例。
2、SingleTop
如果要启动的Activity已经在栈顶,则不会重新创建Activity,只会调用该Activity的onNewIntent()方法。如果要启动的Activity不在栈顶,则会重新创建该Activity的实例。场景:通知消息打开的页面
3、SingleTask
如果要启动的Activity已经存在于它想要归属的栈中,那么不会创建该Activity实例,将栈中位于该Activity上的所有的Activity出栈,同时该Activity的onNewIntent()方法会被调用。
4、SingleInstance
要创建在一个新栈,然后创建该Activity实例并压入新栈中,新栈中只会存在这一个Activity实例。场景:呼叫来电界面
三、Activity的启动流程
1、点击桌面App图标,Launcher进程采用Binder IPC向system_server进程发起startActivity请求;
2、system_server进程接收到请求后,向zygote进程发送创建进程的请求;
3、Zygote进程fork出新的子进程,即App进程;
4、App进程,通过Binder IPC向sytem_server进程发起attachApplication请求;
5、system_server进程在收到请求后,进行一系列准备工作后,再通过binder IPC向App进程发送scheduleLaunchActivity请求;
6、App进程的binder线程(ApplicationThread)在收到请求后,通过handler向主线程发送LAUNCH_ACTIVITY消息;
7、主线程在收到Message后,通过发射机制创建目标Activity,并回调Activity.onCreate()等方法。
四、常见面试题
1、弹出 Dialog 对Activity的生命周期有什么影响?
2、横竖屏切换的时候,生命周期方法是如何调用的?如何进行配置呢?
3、onSaveInstanceState()方法的作用,什么时候会被调用?
4、Activity之间传递数据的方式Intent是否有大小限制,如果传递的数据量较大,有什么方案可以解决