You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
根据现有实例所处的状态不同onNewIntent()方法的调用时机也不同,总的说如果系统调用onNewIntent()方法则系统会在onResume()方法执行之前调用它.这也是官方API为什么只说"you can count on onResume() being called after this method",而不具体说明调用时机的原因.
Reacted by 103style, shuandroid, ooooooooomyfault, zzsakurazz, yangtianzheng1, sg666, Natanic and ailichao
根据现有实例所处的状态不同onNewIntent()方法的调用时机也不同,总的说如果系统调用onNewIntent()方法则系统会在onResume()方法执行之前调用它.这也是官方API为什么只说"you can count on onResume() being called after this method",而不具体说明调用时机的原因.
Activity
DogLaShi commentedon Sep 2, 2019
当目标activity启动模式为singleTop的时候,并且目标activity之前已经存在了,这时启动目标activity就会走onnewintent方法
103style commentedon Sep 2, 2019
@DogLaShi 你的回答 还得加上 当 singleTop的activity在栈顶时的条件。
zhaoerlei1989 commentedon Sep 2, 2019
Activity 的 onNewIntent方法的调用可总结如下:
在该Activity的实例已经存在于Task和Back stack中(或者通俗的说可以通过按返回键返回到该Activity )时,当使用intent来再次启动该Activity的时候,如果此次启动不创建该Activity的新实例,则系统会调用原有实例的onNewIntent()方法来处理此intent.
且在下面情况下系统不会创建该Activity的新实例:
1,如果该Activity在Manifest中的android:launchMode定义为singleTask或者singleInstance.
2,如果该Activity在Manifest中的android:launchMode定义为singleTop且该实例位于Back stack的栈顶.
3,如果该Activity在Manifest中的android:launchMode定义为singleTop,且上述intent包含Intent.FLAG_ACTIVITY_CLEAR_TOP标志.
4,如果上述intent中包含 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志和且包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志.
5,如果上述intent中包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志且该实例位于Back stack的栈顶.
上述情况满足其一,则系统将不会创建该Activity的新实例.
根据现有实例所处的状态不同onNewIntent()方法的调用时机也不同,总的说如果系统调用onNewIntent()方法则系统会在onResume()方法执行之前调用它.这也是官方API为什么只说"you can count on onResume() being called after this method",而不具体说明调用时机的原因.
103style commentedon Sep 2, 2019
三个测试
Activity分别为ActivityA、ActivityB、ActivityC默认启动模式为:
默认点击事件
直接运行 生命周期变化打印日志
修改
ActivityC的launchMode为singleTop然后运行 生命周期变化打印日志:在原配置上修改
ActivityB的launchMode为singleTop,修改点击事件为A → B、B → C、C → B然后运行 生命周期变化打印日志:至此证明只有当singleTop修饰的Activity X在栈顶时,再次启动Activity X则会走onNewIntent
在上面那个示例中 将
ActivityB的launchMode从singleTop修改为singleTask, 然后运行 生命周期变化打印日志:我们可以看到被
singleTask修饰的MainActivityB,在C中启动时,先调用了onNewIntent,然后继续走了onStart、onResume将上述示例中的
singleTask修改为singleInstance,然后运行 生命周期变化打印日志:结果同
singleTask修饰的效果一样。将上述示例中的
singleInstance修改为singleTop,并在C跳转B的Intent上添加intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);然后运行 生命周期变化打印日志:再点击返回直到回退到桌面
我们发现该实例的效果相当于启动
singleTask、singleInstance的MainActivityBIntent Flags 的官方介绍
gabyallen commentedon Sep 2, 2019
Activity 的 onNewIntent方法的调用可总结如下:
在该Activity的实例已经存在于Task和Back stack中(或者通俗的说可以通过按返回键返回到该Activity )时,当使用intent来再次启动该Activity的时候,如果此次启动不创建该Activity的新实例,则系统会调用原有实例的onNewIntent()方法来处理此intent.
且在下面情况下系统不会创建该Activity的新实例:
1,如果该Activity在Manifest中的android:launchMode定义为singleTask或者singleInstance.
2,如果该Activity在Manifest中的android:launchMode定义为singleTop且该实例位于Back stack的栈顶.
3,如果该Activity在Manifest中的android:launchMode=“singleInstance”,或者intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP)标志.
4,如果上述intent中包含 Intent.FLAG_ACTIVITY_CLEAR_TOP 标志和且包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志.
5,如果上述intent中包含 Intent.FLAG_ACTIVITY_SINGLE_TOP 标志且该实例位于Back stack的栈顶.
上述情况满足其一,则系统将不会创建该Activity的新实例.
根据现有实例所处的状态不同onNewIntent()方法的调用时机也不同,总的说如果系统调用onNewIntent()方法则系统会在onResume()方法执行之前调用它.这也是官方API为什么只说"you can count on onResume() being called after this method",而不具体说明调用时机的原因.
bukeCN commentedon Sep 2, 2019
调用时机是为 Activity 设置了特殊的启动模式(主要是两种 single 模式)或者添加了可复用的 FLAG 时会调用,通俗讲就是当需要复用 activity 时会调用此方法。
yangfanggang commentedon Sep 2, 2019
各位大佬说的很好 我是小黑
IT666 commentedon Sep 27, 2019
onNewIntent的调用时机:只要该Activity实例在栈中存在,每次复用Activity的时候,都会调用onNewIntent,而不会重新创建Activity实例。
singleTop、singleTask、singleInstance模式下都会调用onNewIntent()。
调用onNewIntent()生命周期如下:onNewIntent()->onRestart()->onStart()->onResume()。
注意:在onNewIntent()中一定要设置setIntent(intent),否则getIntent()时获取到的是旧的intent,而不是新的intent。
mlinqirong commentedon Dec 14, 2021
onNewIntent的调用时机:只要该Activity实例在栈中存在,每次复用Activity的时候,都会调用onNewIntent,而不会重新创建Activity实例。