向上导航未启动父活动

时间:2016-07-01 00:53:52

标签: android android-intent android-activity android-notifications

我有两个活动AB,其中A是B的父级。现在我显示启动B的通知。当我点击通知时,B启动。然后我点击 up 按钮。当活动A在backstack中时它会运行finr,否则app会关闭并且不会启动活动A.

我的设置。

我已使用 SingleTop launchMode

中的A声明A作为清单中的B的父级
<activity
        android:name=".A"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:launchMode="singleTop"
        android:theme="@style/AppTheme.NoActionBar">
        <intent-filter>
            <action android:name="<packegeName>.Home" />
        </intent-filter>
    </activity>
    <activity
        android:name=".B"
        android:label="@string/app_name"
        android:screenOrientation="portrait"
        android:parentActivityName=".A"
        android:theme="@style/AppTheme.NoActionBar">
        <meta-data
            android:name="android.support.PARENT_ACTIVITY"
            android:value=".A" />
    </activity>

这是通知意图:

Intent intent = new Intent(this, B.class);
intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pendingIntent = PendingIntent.getActivity(this, 0, intent, 
                                                        PendingIntent.FLAG_ONE_SHOT);

在活动B中:

@Override
public void onCreate(Bundle savedInstanceState) {
    ....
    Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
    setSupportActionBar(toolbar);
    getSupportActionBar().setDisplayHomeAsUpEnabled(true);
    ....
}

我尝试了什么

为了进行调试,我尝试在活动B onResume中尝试手动触发此导航,其中包含以下所有内容:

1)

Intent upIntent = NavUtils.getParentActivityIntent(this);
upIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
    // This activity is NOT part of this app's task, so create a new task
    // when navigating up, with a synthesized back stack.
    TaskStackBuilder.create(this)
            // Add all of this activity's parents to the back stack
            .addNextIntentWithParentStack(upIntent)
            // Navigate up to the closest parent
            .startActivities();
} else {
    // This activity is part of this app's task, so simply
    // navigate up to the logical parent activity.
    NavUtils.navigateUpTo(this, upIntent);
}

2)

onNavigateUp();

3)

NavUtils.navigateUpFromSameTask(this);

但当活动A不在Backstack中时,这些似乎都不起作用,应用程序就会退出。

我已经搜索了SO和谷歌(甚至是bing!)寻找答案,并尝试了我找不到的一切。由于没有错误或日志输出,我也不知道如何调试它。

任何有关发现问题的解决方案或提示都将不胜感激。

感谢。

3 个答案:

答案 0 :(得分:2)

尝试针对Synthesize a new Back Stack for Deep Links

所述的方法

您将使用TaskStackBuild构建后台堆栈,并在活动B开始时获取PendingIntent。

检查Android设计模式中的this视频解释简单。

答案 1 :(得分:2)

@ pablobu的答案对我有用,但我想对我发现的内容添加更多解释。

该死的文件令人困惑

我最初感到困惑的原因是this

  

如果您的活动提供了允许其他应用启动活动的任何意图过滤器,您应该实现onOptionsItemSelected()回调,这样如果用户在从其他应用的任务输入您的活动后按下向上按钮,您的应用就会启动一个新的在导航之前使用适当的后栈进行任务。

    if (NavUtils.shouldUpRecreateTask(this, upIntent)) {
        // This activity is NOT part of this app's task, so create a new task
        // when navigating up, with a synthesized back stack.
        TaskStackBuilder.create(this)
                // Add all of this activity's parents to the back stack
                .addNextIntentWithParentStack(upIntent)
                // Navigate up to the closest parent
                .startActivities();
    } else {
        // This activity is part of this app's task, so simply
        // navigate up to the logical parent activity.
        NavUtils.navigateUpTo(this, upIntent);
    }

我的印象是这会为我生成背板。但是有区别。

仅当当前活动在另一个应用程序的任务中时,

NavUtils.shouldUpRecreateTask(this, upIntent)才会返回true。至于从通知启动,这将是错误的,因此任务堆栈构建代码不会执行。

正确的方法是在生成通知并将其作为待处理意图传递时构建backstack。来自this page

  

当通知将用户带到应用程序层次结构深处的活动时,您可以使用此代码创建启动活动的PendingIntent并将新的后备堆栈插入到目标任务中。

Intent detailsIntent = new Intent(this, DetailsActivity.class);
// Use TaskStackBuilder to build the back stack and get the PendingIntent
PendingIntent pendingIntent =
        TaskStackBuilder.create(this)
                        // add all of DetailsActivity's parents to the stack,
                        // followed by DetailsActivity itself
                        .addNextIntentWithParentStack(detailsIntent)
                        .getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(this);
builder.setContentIntent(pendingIntent);

答案 2 :(得分:0)

覆盖 Activity 中的 event.getTestCase().getLine() 方法并始终返回 public boolean shouldUpRecreateTask(Intent targetIntent)