NavUtils.navigateUpTo()不会启动任何Activity

flx*_*flx 45 android android-lifecycle android-activity

我有两个活动

  • MainActivity
  • DeepLinkActivity

我设置了所有内容,NavUtils以便像在这里,这里这里建议一样进行导航.

我想要实现的是:

  1. DeepLinkActivity深层链接开始
  2. 按下来
  3. MainActivity

只要我的应用程序在最近的应用程序中有任何任务,一切都很好.

但是,当我从最近的应用程序中删除我的应用程序时,它的行为如下:

  1. 从最近的应用中移除我的应用
  2. DeepLinkActivity深层链接开始
  3. 按下来
  4. 我的应用程序关闭,就像按下时一样

我调试了代码,然后发现,NavUtils.shouldUpRecreateTask()返回false. upIntent将所有内容设置为正常,就像我的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>
Run Code Online (Sandbox Code Playgroud)

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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

我意识到一些Google Apps以同样的方式被破坏了.如果你从搜索中跳到例如联系人,按下AB键,你会发现自己在主屏幕而不是联系人应用程序.(API19/CM11)

Sok*_*lov 56

我对OP问题的解决方案:

public void navigateUp() {
    final Intent upIntent = NavUtils.getParentActivityIntent(this);
    if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
        Log.v(logTag, "Recreate back stack");
        TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities();
    } else {
        NavUtils.navigateUpTo(this, upIntent);
    }
}
Run Code Online (Sandbox Code Playgroud)

isTaskRoot()如果DeepLinkActivity是任务的根,则会返回true (应用程序或应用程序的初始启动先前已通过任务管理器终止).这样,如果在应用程序任务已经在前台时通过链接启动了活动,我就不会丢失现有的后台堆栈.

  • 实际上,这是@Mikooos解决方案. (4认同)

non*_*oni 22

我认为这种方法有问题.我已阅读支持库源代码,该方法检查intent的操作.它只适用于您之前创建的应用程序.如您所描述的,如果您从应用预览中删除它,则应该停止工作.

我用自己的"shouldUpRecreateTask"解决了这个问题.当我收到直接创建活动的通知(就像你的行为一样)时,我会从我的BroadCastReceiver中发送一个自定义Action.然后,在我的方法中,我做下一件事:

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

..........................

 if (shouldUpRecreateTask(this)) {
      TaskStackBuilder.create(this)
       .addNextIntentWithParentStack(upIntent)
       .startActivities();
 } else {
       fillUpIntentWithExtras(upIntent);
       NavUtils.navigateUpTo(this, upIntent);
 }
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用Activity#isTaskRoot方法而不是添加自定义操作.我的导航看起来像这样,我没有发现它的问题:http://pastebin.com/dTz1UEH5 Intent upIntent = NavUtils.getParentActivityIntent(this); if(NavUtils.shouldUpRecreateTask(this,upIntent)|| isTaskRoot()){TaskStackBuilder.create(this).addNextIntentWithParentStack(upIntent).startActivities(); } else {NavUtils.navigateUpTo(this,upIntent); } (18认同)

flx*_*flx 7

看起来似乎NavUtils.shouldUpRecreateTask(this, upIntent)没有为这个特殊情况做好准备.

我目前的解决方法是检查,如果Activity是深度链接并强制新的任务堆栈这样的情况.

就我而言,我在EXTRA内部传递s中的对象.但是ACTION,Uri如果Activity通过跟踪指向特定URL的链接或触摸NFC感知设备从外部启动,则设置为.

@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)
                    || getIntent().getAction() != null) { // deep linked: force new stack
                // 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);
    }
}
Run Code Online (Sandbox Code Playgroud)