Child activity 从通知启动不会在向上导航中 return 到 parent
Child activity launched from notification does not return to parent on up navigation
我正在启动 activity -- 谁有 parent activity -- 来自通知抽屉中的通知。 child activity 启用了向上导航。单击向上导航按钮时,我希望 child activity 到 return 到 parent activity。此行为适用于正常的应用程序流程。但是,当用户通过通知输入 child activity 时,单击向上导航按钮不会将用户带到 parent activity;相反,它会结束应用程序。
这是单击通知时应启动的 activity 的清单。它有一个 parent TabbedActivity
<activity
android:name=".activity.AnimalDetailsActivity"
android:parentActivityName=".activity.TabbedActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.TabbedActivity"/>
</activity>
这里是我生成通知和意图的地方:
Intent resultIntent = new Intent(context.getApplicationContext(), AnimalDetailsActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context.getApplicationContext());
stackBuilder.addParentStack(AnimalDetailsActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setSmallIcon(icon_resource_id)
.setLargeIcon(large_icon)
.setContentTitle(title)
.setContentText(text)
.setContentIntent(resultPendingIntent)
.setAutoCancel(true);
return builder.build();
然后我送他们走
private static void sendNotifications(List<android.app.Notification> notifications) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
for (android.app.Notification notification : notifications) {
manager.notify(++drawerId, notification);
}
}
在目标 activity 内,我启用向上按钮箭头和向上导航:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);
我相信我正确地遵循了指南。那么,为什么向上箭头没有将用户带到 parent activity?
根据 documentation,如果您使用新的返回堆栈启动 activity,则应按如下方式实现 onOptionsItemSelected()
回调:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
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);
}
return true;
}
return super.onOptionsItemSelected(item);
}
要添加到已接受的答案中,我会添加 isTaskRoot()
检查:
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
/* ... */
}
因为当应用程序从通知中启动时,启动的 Activity 是应用程序堆栈的一部分,但我们仍然希望 parents 的任务重新创建。
我正在启动 activity -- 谁有 parent activity -- 来自通知抽屉中的通知。 child activity 启用了向上导航。单击向上导航按钮时,我希望 child activity 到 return 到 parent activity。此行为适用于正常的应用程序流程。但是,当用户通过通知输入 child activity 时,单击向上导航按钮不会将用户带到 parent activity;相反,它会结束应用程序。
这是单击通知时应启动的 activity 的清单。它有一个 parent TabbedActivity
<activity
android:name=".activity.AnimalDetailsActivity"
android:parentActivityName=".activity.TabbedActivity" >
<meta-data
android:name="android.support.PARENT_ACTIVITY"
android:value=".activity.TabbedActivity"/>
</activity>
这里是我生成通知和意图的地方:
Intent resultIntent = new Intent(context.getApplicationContext(), AnimalDetailsActivity.class);
TaskStackBuilder stackBuilder = TaskStackBuilder.create(context.getApplicationContext());
stackBuilder.addParentStack(AnimalDetailsActivity.class);
stackBuilder.addNextIntent(resultIntent);
PendingIntent resultPendingIntent = stackBuilder.getPendingIntent(0, PendingIntent.FLAG_UPDATE_CURRENT);
NotificationCompat.Builder builder = new NotificationCompat.Builder(context)
.setSmallIcon(icon_resource_id)
.setLargeIcon(large_icon)
.setContentTitle(title)
.setContentText(text)
.setContentIntent(resultPendingIntent)
.setAutoCancel(true);
return builder.build();
然后我送他们走
private static void sendNotifications(List<android.app.Notification> notifications) {
NotificationManager manager = (NotificationManager) context.getSystemService(Context.NOTIFICATION_SERVICE);
for (android.app.Notification notification : notifications) {
manager.notify(++drawerId, notification);
}
}
在目标 activity 内,我启用向上按钮箭头和向上导航:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getActionBar().setHomeButtonEnabled(true);
getActionBar().setDisplayHomeAsUpEnabled(true);
我相信我正确地遵循了指南。那么,为什么向上箭头没有将用户带到 parent activity?
根据 documentation,如果您使用新的返回堆栈启动 activity,则应按如下方式实现 onOptionsItemSelected()
回调:
@Override
public boolean onOptionsItemSelected(MenuItem item) {
switch (item.getItemId()) {
// Respond to the action bar's Up/Home button
case android.R.id.home:
Intent upIntent = NavUtils.getParentActivityIntent(this);
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);
}
return true;
}
return super.onOptionsItemSelected(item);
}
要添加到已接受的答案中,我会添加 isTaskRoot()
检查:
if (NavUtils.shouldUpRecreateTask(this, upIntent) || isTaskRoot()) {
/* ... */
}
因为当应用程序从通知中启动时,启动的 Activity 是应用程序堆栈的一部分,但我们仍然希望 parents 的任务重新创建。