课程名称:BAT大牛亲授技能+技巧 Android面试快速充电升级
课程章节:Android基础相关面试问题
主讲老师:DocMike
课程内容
Activity 的启动模式
<activity>标签的launchMode属性可以设置为四种不同的模式:
standard(默认模式)
singleTop
singleTask
singleInstance
这几种模式的区别体现以下四点上:
-
1.当这个activity被激活的时候,会放入哪个任务栈
对于“standard”和“singleTop”模式,这个新被激活的activity会放入和之前的activity相同的任务栈中,除非如前所述,Intent对象包含FLAG_ACTIVITY_NEW_TASK标志。但“singleTask”和“singleInstance”模式则表示这个新被激活的activity不会放入已经存在的任务栈中,它会重新开启一个任务栈,并作为这个新的任务栈的根activity。 -
2.是否可以存在这个activity类型的多个实例
对于“standard”和“singleTop”模式,可以有多个实例,并且这些实例可以属于不同的任务栈,每个任务栈也可以包含有这个activity类型的多个实例。但“singleTask”和“singleInstance”模式则表示至多只可以存在这个activity类型的一个实例。又因为有第一点必须是根activity的限制,所以这意味着在同一时间,在手机上绝不会存在多于一个的由这个activity启动的任务栈。 -
3.包含此activity的任务栈是否可以包含其它的activity
“singleInstance”模式表示包含此activity的任务栈不可以包含其它的activity。若此activity启动了另一个activity组件,那么无论那个activity组件的启动模式是什么或是Intent对象中是否包含了FLAG_ACTIVITY_NEW_TASK标志,它都会被放入另外的任务栈。在其它方面“singleInstance”模式和“singleTask”模式是一样的。其余三种启动模式则允许包含此activity的任务栈包含其它的activity。 -
4.每一个activity实例处理一个intent
对于默认的“standard”模式,每当响应一个Intent对象,都会创建一个这种activity类型的新的实例。即每一个activity实例处理一个intent。对于“singleTop”模式,只有当这个activity的实例当前处于任务栈的栈顶位置,则它会被重复利用来处理新到达的intent对象。否则就和“standard”模式的行为一样。正如第二点所说的,“singleTask”和“singleInstance”模式表示只能有一个实例,所以这个唯一的实例需要处理所有新到达的intent对象。又由于“singleInstance”模式的activity实例总是位于任务栈的栈顶,所以这样做很正常。但对于“singleTask”模式的acitvity,在其上面可能存在其它的activity组件,所以它的位置并不是栈顶,在这种情况下,intent对象会被丢弃。(虽然会被丢弃,但是这个intent对象会使这个任务栈切换到前台)
如果一个新到达的intent对象是被一个已经存在的activity组件来处理的,那么这个activity的onNewIntent(android.content.Intent)方法会被系统调用。
注意:若为了处理一个新到达的intent对象而创建了一个activity实例,则用户按下“BACK”键就会退到之前的那个activity。但若这个新到达的intent对象是由一个已经存在的activity组件来处理的,那么用户按下“BACK” 键就不会回退到处理这个新intent对象之前的状态了。
异常情况下 Activity 的生命周期
当 Activity 发生异常时(通常是配置发生改变或内存不足时),会调用 onSaveInstanceState()方法,在这个方法中可以通过使用 Bundle 进行数据保存。
当 Activity 被重新创建后,会调用 onRestoreInstanceState()方法进行数据的恢复,在这个方法中会通过回调的方式,获取到在onSaveInstanceState()方法中保存的 Bundle,也会把这个 Bundle 回调给 onCreate() 方法。
onSaveInstanceState()方法和 onRestoreInstance()方法只有在 Activity被异常销毁或重建的时候,才会调用,通常会选取 onCreate()方法和 onSavaInstance()方法中的一个进行数据的恢复,由于onRestoreInstanceState() 的调用时机是在 onStart()之后,onResume() 之前,并且调用 onRestoreInstance() 时,Bundle 一定非空,更建议使用 onRestoreInstance()来恢复数据。
课程收获
这一章的内容是关于 Android 基础的,而 Activity 的内容更是基础中的基础,在面试时通常会作为开始的热身问题。平时更多关注的是正常情况下 Activity 的生命周期,很少去留意异常情况下 Activity 的生命周期。这一章的内容正好补充了这一块,无论是否要面试,过一遍这一章内容,相信在 Activity 的知识上就没有什么短板了。