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()触发机制及注意事项

猜你喜欢

转载自blog.csdn.net/weixin_38196407/article/details/88351030