关于onNewIntent你应该知道的

一、API描述

在这里插入图片描述
翻译过来就是:如果在 AndroidManifest.xml 中,将 Activity 的 launchMode 设置成了 “singleTop” 模式,或者在调用 startActivity(Intent) 时,设置了FLAG_ACTIVITY_SINGLE_TOP标识,那么,当该 Activity 再次被启动时,如果它依然存在于Activity栈中,并且刚好处于栈的最顶层,那么它将不会被重新创建,而是直接使用原来的实例,此时,onNewIntent(Intent)将会被调用,后续生命周期中的其它方法,就可以使用 onNewIntent(Intent)传递过来的新的Intent参数了。调用顺序如下:

onPause -> onNewIntent() -> onResume()

activity栈唯一(singleTask)原则下,通过Intent启动一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,但这个时候,系统不会再创建一个新的实例,不会调用onCreate方法,而是调用onNewIntent方法,调用顺序如下:

onRestart -> onStart -> onNewIntent() -> onResume()

二、onNewIntent与启动模式

  • 当ActivityA的LaunchMode为Standard时:

由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法;

  • 当ActivityA的LaunchMode为SingleTop时:

如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent()方法 ,生命周期顺序为:

onPause -> onNewIntent() -> onResume()

如果ActivityA不在栈顶,且现在要再启动ActivityA,这时就是正常启动一个Activity,不会调用onNewIntent方法,其生命周期顺序为:

onCreate -> onStart() -> onResume()

  • 当ActivityA的LaunchMode为SingleInstance或者SingleTask时:

如果ActivityA已经在任务栈中且ActivityA不在栈顶,再次启动ActivityA,那么此时会调用onNewIntent()方法,生命周期调用顺序为:

onRestart -> onStart -> onNewIntent() -> onResume()

如果ActivityA已经在任务栈中且ActivityA在栈顶,再次启动ActivityA,那么此时会调用onNewIntent()方法,生命周期调用顺序为:

onPause -> onNewIntent() -> onResume()

三、注意事项

  1. 有时候,我们在多次启动同一个栈唯一(singleTask)模式下的activity时,在onNewIntent()里面的getIntent()得到的intent感觉都是第一次的那个数据。对,这里就是这个陷阱。因为它就是会返回第一个intent的数据。原因就是我们没有在onNewIntent()里面设置setIntent(),将最新的intent设置给这个activity实例。
    举个例子:
    普通的Activity之间的跳转,如:新打开一个Activity,此时的执行顺序是onCreate–onStart–onResume…此时使用intent传递数据没问题,在下一个Activity中直接getIntent()。但是如果是从A–B–A,且A设置为singleTask模式,则在B–A时,实际执行的是onRestart–>onStart–>onNewIntent–>onResume…此时从B传递过来的intent,需要在onNewIntent()中赋值给A的old intent,这样在getIntent()时获取的才是B传回来的intent。 也就是说,当调用到onNewIntent(intent)的时候,需要在onNewIntent()中使用setIntent(intent)赋值给Activity的intent。如果在onNewIntent(Intent) 中,不调用 setIntent(Intent) 方法对 Intent进行更新的话,那么之后在调用 getIntent() 方法时得到的依然是最初的值。
protected void onNewIntent(Intent intent) {
  super.onNewIntent(intent);
  // must store the new intent unless getIntent() will return the old one
  setIntent(intent);
  getNewIntent();
}

在这里,如果你没有调用setIntent()方法的话,则getIntent()获取的intent都只会是最初那个intent(must store the new intent unless getIntent() will return the old one)。

  1. 在内存吃紧的情况下,系统可能会kill掉后台运行的 Activity ,如果不巧要启动的那个activity实例被系统kill了,那么系统就会调用 onCreate 方法,而不调用 onNewIntent 方法。这个好的解决办法就是在 onCreate() 和 onNewIntent() 中根据需要进行一些相同的处理。

四、总结

① 如果ActivityA已经启动过,处于当前应用的Activity堆栈中;当ActivityA的LaunchMode为SingleTop时,如果ActivityA在栈顶,且现在要再启动ActivityA,这时会调用onNewIntent方法。
② 当ActivityA的LaunchMode为SingleInstance、SingleTask时,如果ActivityA已经在堆栈中,那么此时会调用onNewIntent方法。
③ 当ActivityA的LaunchMode为Standard时,由于每次启动ActivityA都是启动新的实例,和原来启动的没关系,所以不会调用原来ActivityA的onNewIntent方法,仍然调用的是onCreate方法。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值