【问题标题】:Bug: onNewIntent not called for singleTop activity with Intent.FLAG_ACTIVITY_NEW_TASK [closed]错误:使用 Intent.FLAG_ACTIVITY_NEW_TASK 的 singleTop 活动不调用 onNewIntent [关闭]
【发布时间】:2012-12-28 13:30:10
【问题描述】:

startActivity 中似乎存在错误。

通过在 AndroidManifest.xml 中将活动设置为singleTop 和不同的taskAffinity,并在调用startActivity 时使用Intent.FLAG_ACTIVITY_NEW_TASK,可以在两个任务中创建两个活动(每个任务一个活动)。

再次调用startActivity 将返回到第一个活动/任务并调用onNewIntent。但是,第四次调用startActivity 将返回到第二个活动/任务,但不会调用onNewIntent

这两个任务的唯一区别是它们的taskAffinity。不知何故,观察到不对称行为。

但是,如果Intent.FLAG_ACTIVITY_SINGLE_TOP 也被使用,那么onNewIntent 会按预期调用。

AndroidManifest.xml 中的singleTop 似乎与Intent 中的Intent.FLAG_ACTIVITY_SINGLE_TOP 不同。

公共类 ActivityA 扩展 Activity 实现 OnClickListener { 私有字符串标签; @覆盖 public void onCreate(final Bundle savedInstanceState) { super.onCreate(savedInstanceState); 标签 = getClass().getName(); Log.v(tag, "onCreate()"); 设置内容视图(R.layout.main); 按钮按钮 = (Button)findViewById(R.id.button); button.setText(tag.endsWith("ActivityA") ? "Activity B" :“活动A”); button.setOnClickListener(this); } @覆盖 公共无效 onClick(查看 v){ 意图意图; int 标志 = Intent.FLAG_ACTIVITY_NEW_TASK // | Intent.FLAG_ACTIVITY_SINGLE_TOP ; Log.v(tag, "onClick()"); 意图=新意图(这个, tag.endsWith("ActivityA") ? ActivityB.class : ActivityA.class); 意图.setFlags(标志); 开始活动(意图); } @覆盖 受保护的无效onNewIntent(意图意图){ Log.v(tag, "onNewIntent()"); } } 公共类 ActivityB 扩展 ActivityA { } 活动> 活动> 应用> 清单>

【问题讨论】:

    标签: android


    【解决方案1】:

    这有点晚了,但因为我刚刚遇到这个 - 正如马特所提到的,清单和意图中的标志活动单顶是不一样的(至少在以前版本的 android 上)。

    startActivityUncheckedLocked方法中:

    姜饼 - 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

    短版本是 - 在意图和清单中设置单个顶部标志。

    (感谢对 android bug tracker 中相关 bug 的评论指出我要查看哪个源文件 - http://code.google.com/p/android/issues/detail?id=4155#c9)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-02-27
      • 2017-05-17
      • 1970-01-01
      • 1970-01-01
      • 2021-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多