Android关于Activity的那些事儿

对于Android开发者,Activity那是再熟悉不过了;而今天咱们主要谈一下Activity的主要考察点,帮助大家回顾一下Activity的尘封记忆…

Android 官方文档

1. Activity的启动模式(launchMode)

Activity的任务栈及启动模式

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()就是在这样的时机被系统调用。

  1. onPause() —> onNewIntent() —> onResume
  2. 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的状态保存

Activity的状态变更
Activity的保存界面状态


涉及到状态保存的两个函数:

  1. onSaveInstanceState()
 override fun onSaveInstanceState(outState: Bundle) {
        // TODO 保存操作
		//始终调用 onSaveInstanceState() 的超类实现,以便默认实现可以保存视图层次结构的状态。
        super.onSaveInstanceState(outState)
    }
  1. 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系统常规都有三个按键:

  1. 返回键(Back);
  2. 主屏键(Home);
  3. 任务(菜单)键

有了上面的常识,现在我们就切入正题,onSaveInstanceState()的调用时机:

  1. 点击Home键,任务键,电源键熄屏操作,都会触发 onSaveInstanceState()
  2. Activity 跳转;
  3. 屏幕旋转or切换到多窗口模式;

大多数应用都应实现 onSaveInstanceState() 来处理系统发起的进程终止.


1.3.2 onRestoreInstanceState()的触发时机

onRestoreInstanceState()在onStart()调用。

该方法必须是宿主Activity确实被销毁再创建才有可能调用。系统只在存在要恢复的已保存状态时调用 onRestoreInstanceState(),因此您无需检查 Bundle 是否为 null。
如果想查看onRestoreInstanceState()的调用,最好使用屏幕旋转来实验。


1.3.3 恢复状态的两种方式

由于onRestoreInstanceState()必须是在Activity销毁后才调用的。聪明的你们都已经发现我们其实可以通过两种途径来恢复数据。

  1. 在onCreate()中,但是需要对bundle进行判空操作;
  2. 在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系统的设计者,肯定是要先响应跳转事件的。这样才能有更好的交互体验。

  1. A —> B的过程:

A: onPause()
B:onCreate() —> onStart() —> onResume()
A:onStop()

  1. B —> A的过程:

B: onPause()
A: onRestart() —> onStart() —> onResume()
B: onStop() —> onDestory()

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值