对于Android开发者,Activity那是再熟悉不过了;而今天咱们主要谈一下Activity的主要考察点,帮助大家回顾一下Activity的尘封记忆…
1. Activity的启动模式(launchMode)
standard(默认的):
singleTop:
singleTask:
singleInstance:
1.1 singleInstance的注意事项
singleInstance是新开辟一个stack,且该栈里面有且仅有这一个实例。
PS:其它Activity也设置为singleInstance,也是另开辟一个stack。即:新开辟的Stack不是公共的。
验证方式:在Activity中打印一下:getTaskId() 即可。
2 关于onNewIntent()
1.2.1 onNewIntent()的调用时机
onNewIntent() 是当Activity的回退栈中存在目标实例时,就无需再走onCreate()的重建过程。这样也避免了频繁创建Activity的内存开销。
onNewIntent() 跟 standard启动模式没有任何关系…;
启动模式singleTop,singleTask,singleInstance,这三者都会在使Activity的回退栈保留activity的实例。onNewIntent()就是在这样的时机被系统调用。
- onPause() —> onNewIntent() —> onResume
- onNewIntent() —> onRestart() —> onStart() —> onResume (PS:在Android R上略有不同,oNewIntent()在 onStart() 之后)
两者的区别在于:目标Activity是否调用了**onStop()**方法。
1.2.2 获取intent数据
必须在onNeWIntent()调用setIntent(),否则获取到的一直是老的intent。
@Override
protected void onNewIntent(Intent intent) {
super.onNewIntent(intent);
setIntent(intent);//(必须)刷新 intent
}
另外,有时候目标Activity被系统回收,则将重新执行onCreate() —> onStart() … 流程。这时onNewIntent()不会被调用。即拿不到intent中的数据。HOW?
方案1:在onNewIntent() 和 onCreate() 方法中都实现取数据的操作;
方案2:在onResume中取数据;(个人推荐…)
3 关于Activity的状态保存
涉及到状态保存的两个函数:
- onSaveInstanceState()
override fun onSaveInstanceState(outState: Bundle) {
// TODO 保存操作
//始终调用 onSaveInstanceState() 的超类实现,以便默认实现可以保存视图层次结构的状态。
super.onSaveInstanceState(outState)
}
- onRestoreInstanceState()
override fun onRestoreInstanceState(savedInstanceState: Bundle) {
super.onRestoreInstanceState(savedInstanceState)
// TODO 取操作
}
官方文档中强调:请勿将 onSavedInstanceState() 用于存储大量的数据,只能用于存储基本类型和简单的小对象,例如字符串。大多数应用都应实现 onSaveInstanceState() 来处理系统发起的进程终止.
1.3.1 onSaveInstanceState()的触发场景
这里需要注意:**onSaveInstanceState()**在onPause()之后还是onStop()之后有争议,可以自行打印查看。(PS: Android R 是 onStop() —> onSaveInstanceState())这里不再展开话题…
闲聊半句,Android系统常规都有三个按键:
- 返回键(Back);
- 主屏键(Home);
- 任务(菜单)键
有了上面的常识,现在我们就切入正题,onSaveInstanceState()的调用时机:
- 点击Home键,任务键,电源键熄屏操作,都会触发 onSaveInstanceState()
- Activity 跳转;
- 屏幕旋转or切换到多窗口模式;
大多数应用都应实现 onSaveInstanceState() 来处理系统发起的进程终止.
1.3.2 onRestoreInstanceState()的触发时机
onRestoreInstanceState()在onStart()调用。
该方法必须是宿主Activity确实被销毁再创建才有可能调用。系统只在存在要恢复的已保存状态时调用 onRestoreInstanceState(),因此您无需检查 Bundle 是否为 null。
如果想查看onRestoreInstanceState()的调用,最好使用屏幕旋转来实验。
1.3.3 恢复状态的两种方式
由于onRestoreInstanceState()必须是在Activity销毁后才调用的。聪明的你们都已经发现我们其实可以通过两种途径来恢复数据。
- 在onCreate()中,但是需要对bundle进行判空操作;
- 在onRestoreInstanceState()中,无需判空操作。
It’s up to you !!!
4. Activity的配置改变事件
onConfigurationChanged()方法。要想感知该事件,需要在清单文件中配置Activity的configChanges=“orientation”
更加详细的内容,可以参考:onConfigurationChanged
5. Activity的生命周期问题
题目 : Activity : A —> B — A (返回键操作),请说明A,B两个Activity的生命周期的变化过程。(PS:有兴趣可以结合LaunchMode , 状态变更来考虑该问题)
这里我们首先要明白:如果你是Android系统的设计者,肯定是要先响应跳转事件的。这样才能有更好的交互体验。
- A —> B的过程:
A: onPause()
B:onCreate() —> onStart() —> onResume()
A:onStop()
- B —> A的过程:
B: onPause()
A: onRestart() —> onStart() —> onResume()
B: onStop() —> onDestory()