我有两个活动A
和B
,其中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
中尝试手动触发此导航,其中包含以下所有内容:
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);
}
onNavigateUp();
NavUtils.navigateUpFromSameTask(this);
但当活动A不在Backstack中时,这些似乎都不起作用,应用程序就会退出。
我已经搜索了SO和谷歌(甚至是bing!)寻找答案,并尝试了我找不到的一切。由于没有错误或日志输出,我也不知道如何调试它。
任何有关发现问题的解决方案或提示都将不胜感激。
感谢。
答案 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)
。