Android基础知识(七):Activity互调之间的生命周期变化与onNewIntent()触发机制

Android基础知识(七):Activity互调之间的生命周期变化与onNewIntent()触发机制

一、Activity切换的生命周期
前面Android基础知识(五):Activity的生命周期一文中,提到的关于Activity的生命周期只是单个Activity的生命周期,没有说明从一个Activity进入另一个Activity时,或者从一个Activity返回到上一个Activity时这些函数的调用顺序。
从一个Activity进入另一个Activity的函数调用顺序如下。
在这里插入图片描述
从上图可以看到,Activity B在被创建之前(调用onCreate之前),Activity A需要先完成onPause的回调,即前文所说的,onPause方法执行之后,新Activity的onResume方法才会执行
因此onPause方法中虽然可以做一些数据存储或者动画停止或者资源的释放,但是不能太耗时。
从Activity B返回到上一个Activity(A)的函数回调顺序图如下。
在这里插入图片描述
上图考虑的是Activity A完全不可见的情况下,Activity A会回调onStop方法。

二、onNewIntent()触发机制
笔记:Android基础知识(六):Activity的启动模式中,提到了Activity的四种启动模式,在启动模式singleTask和singleTop中,由于系统会判断返回栈中是否存在实例,若存在(singleTop还要求处于栈顶)实例,那么系统会将请求发送到该实例上,因此不会调用常规的onCreate方法,而是调用onNewIntent方法
如下所示为onNewIntent调用时机图。
在这里插入图片描述
当Activity(假设为A)的launchMode为singleTop且A的实例处于栈顶,或者launchMode为singleTask且A的实例已经在栈里(无论是栈顶还是栈中),再次启动Activity A时,便不会调用onCreate()去产生新的实例,而是调用onNewIntent()并重用返回栈里的A实例
如果A在栈顶,那么方法回调的调用顺序依次为A.onPause() -> A.onNewIntent() -> A.onResume()。A的launchMode可以为singleTo或者是singleTask。
如果A不在栈顶,此时它处于A.onStop()状态,当再次启动时,调用顺序依次是A.onStop() -> A.onNewIntent() -> A.onRestart() -> A.onStart() -> A.onResume()。A的launchMode只能是singleTask。

三、onNewIntent()注意事项

  1. 系统kill后台Activity
    需要注意的是Android系统随时会kill后台Activity,如果Activity被kill,那么系统就会调用onCreate方法,而不是调用onNewIntent方法,因此为了解决这个问题,onCreate和onNewIntent方法中需要调用同一个处理数据的方法
    在这里插入图片描述
  2. onNewIntent()的setIntent()和getIntent()
    在使用getIntent()方法获取Intent之前,需要调用setIntent(Intent)方法,否则getIntent()获取的数据将不是所期望的结果。
    getIntent()方法返回的依旧是原来的Intent,需要调用setIntent(Intent)方法更新Intent
    在这里插入图片描述

参考资料:Android activity onNewIntent调用时机
Android:onNewIntent()触发机制及注意事项

  • 2
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值