Bug: 当使用Intent.FLAG_ACTIVITY_NEW_TASK标志时,单个顶部活动的onNewIntent方法未被调用

20
startActivity中似乎存在一个bug。
如果在AndroidManifest.xml中将activities设置为具有不同的taskAffinitysingleTop,并在调用startActivity时使用Intent.FLAG_ACTIVITY_NEW_TASK,则可以在两个任务中创建两个活动(每个任务一个活动)。
再次调用startActivity将返回到第一个活动/任务,并调用onNewIntent。但是,第四次调用startActivity将返回到第二个活动/任务,但是onNewIntent未被调用。
两个任务之间唯一的区别是它们的taskAffinity。某种程度上观察到了不对称的行为。
但是,如果也使用Intent.FLAG_ACTIVITY_SINGLE_TOP,则会按预期调用onNewIntent
看起来,在AndroidManifest.xml中的singleTopIntent中的Intent.FLAG_ACTIVITY_SINGLE_TOP不同。
其中包括以下代码:
...
其中包括以下XML:
...
1个回答

13

虽然有些晚了,但我刚刚看到了这个 - 正如Matt所提到的,在清单文件和意图中flag activity single top是不同的(至少在早期版本的Android中)。

在startActivityUncheckedLocked方法中:

对于Gingerbread版本 - https://github.com/android/platform_frameworks_base/blob/gingerbread/services/java/com/android/server/am/ActivityStack.java

请查看第2204行 -

 if ((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                                && taskTop.realActivity.equals(r.realActivity)) {

因此,它只是检查意图中的启动标志,而不是检查清单。将其与Jellybean MR1版本进行比较:

https://github.com/android/platform_frameworks_base/blob/jb-mr1-release/services/java/com/android/server/am/ActivityStack.java

查看第2835行--

                if (((launchFlags&Intent.FLAG_ACTIVITY_SINGLE_TOP) != 0
                        || r.launchMode == ActivityInfo.LAUNCH_SINGLE_TOP)
                        && taskTop.realActivity.equals(r.realActivity)) {

看起来在mr1中,除了检查意图标志本身的launchFlags外,他们还会检查r.launchMode(假设是AndroidManifest.xml的值),而在旧版本中,他们只检查意图标志。

实际上,它已经在2012年2月16日通过此提交修复: https://github.com/android/platform_frameworks_base/commit/f363dfd26c304bca33f12065a9ed3de291193962

简短的版本是 - 在意图和清单中都设置Single Top标志。

(感谢android错误跟踪器中相关错误的评论指导我查找哪个源文件- http://code.google.com/p/android/issues/detail?id=4155#c9)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接