我有两个 Activity

  • MainActivity
  • DeepLinkActivity

  • 我设置了所有内容以使用NavUtils进行导航,例如建议的hereherehere

    我想要实现的是:
  • 通过深层链接
  • 启动DeepLinkActivity
  • 按下
  • 转到MainActivity

  • 只要我的应用程序在最近的应用程序中有任何任务,一切都可以很好地工作。

    但是,当我从最近的应用程序中滑出我的应用程序时,它的行为如下:
  • 从最近的应用程序中滑动我的应用程序
  • 通过深层链接
  • 启动DeepLinkActivity
  • 按下
  • 我的应用程序关闭,就像按回
  • 一样

    我调试了代码,发现NavUtils.shouldUpRecreateTask()返回falseupIntent将所有内容都设置为正常,就像我的Component设置一样。
    但是,NavUtils.navigateUpTo()的行为就像对finish()的调用一样。
    没有日志语句,什么都没有。

    有什么想法,如何解决?

    AndroidManifest.xml
    <activity
        android:name=".DeepLinkActivity"
        android:parentActivityName="my.package.MainActivity">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value="my.package.MainActivity"/>
        <intent-filter>
            <!-- Some intent filter -->
        </intent-filter>
    </activity>
    

    DeepLinkActivity.java
    @Override
    public boolean onOptionsItemSelected(final MenuItem item) {
        switch (item.getItemId()) {
            case android.R.id.home:
                Intent upIntent = NavUtils.getParentActivityIntent(this);
                if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
                    // create new task
                    TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent)
                            .startActivities();
                } else {
                    // Stay in same task
                    NavUtils.navigateUpTo(this, upIntent);
                }
                return true;
            default:
                return super.onOptionsItemSelected(item);
        }
    }
    

    -----编辑-----

    我意识到一些Google Apps以相同的方式损坏。如果您跳了例如要从搜索到联系人,请在AB中向上按,您会发现自己在主屏幕上,而不是联系人应用程序中。 (API19 / cm11)

    最佳答案

    我认为该方法存在问题。我已经阅读了支持库的源代码,并且该方法检查了intent的 Action 。它仅在以前创建您的应用程序时才起作用。如上所述,如果从应用程序预览中将其杀死,则shouldUp方法将停止工作。

    我已经使用自己的“shouldUpRecreateTask”修复了该问题。当我收到一个直接创建 Activity (与您的行为类似)的通知时,便从我的BroadCastReceiver发送了一个意图内的自定义 Action 。然后,在我的方法中,做下一件事情:

    private final boolean shouldUpRecreateTask(Activity from){
        String action = from.getIntent().getAction();
        return action != null && action.equals(com.xxxxxx.activities.Intent.FROM_NOTIFICATION);
    }
    

    ....................................
     if (shouldUpRecreateTask(this)) {
          TaskStackBuilder.create(this)
           .addNextIntentWithParentStack(upIntent)
           .startActivities();
     } else {
           fillUpIntentWithExtras(upIntent);
           NavUtils.navigateUpTo(this, upIntent);
     }
    

    08-04 19:07