40

我正在尝试使用带有通知的TaskStackBuilder来创建一个返回堆栈以供后退按钮通过。我的应用程序的正常流程:

  1. 活动 A 从启动器启动。
  2. 用户从 A 中选择一个项目,该项目启动 B 并附加要加载的内容。
  3. 用户从 B 中选择一个项目,这将启动 C 并附加要加载的内容。

有时,在用户不使用我的应用程序时进行后台更新后,我会生成通知。如果他们单击此通知,它会启动 Activity C,跳过 A 和 B。我正在尝试遵循设计指南并创建一个后退堆栈,因此当他们按下返回时,它将转到 Activity B 而不是主屏幕。我的问题是 Activity B 在其启动意图中需要额外的内容来告诉它从数据库中获取什么。

我当前的 TaskStackBuilder 代码:

TaskStackBuilder sBuilder = TaskStackBuilder.create( this );
sBuilder.addParentStack( ActivityC.class );
sBuilder.addNextIntent( launchIntent );

pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

单击通知启动 Activity C 就好了,但是当我按下它时,它会IllegalArgumentException从我的 ContentProvider 中爆炸,因为 Activity B 不知道要请求什么 ID。有什么办法可以把这个额外的东西放到后面的堆栈中,还是我被卡住了?

4

3 回答 3

58

这一行:

sBuilder.addParentStack( ActivityC.class );

ActivityC添加在AndroidManifest.xmlin 中声明的所有父母<meta-data>。不知道是什么,没用过。我怀疑你需要它。

此行将意图添加到数组:

sBuilder.addNextIntent(launchIntent);

然后意图数组用于创建 PendingIntent,可能使用PendingIntent.getActivities,我找不到实现,然后在某个地方使用Context.startActivities开始。

我认为您只需要创建一组意图,您就可以在其中添加额外内容:

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

并将它们添加到构建器:

sBuilder.addNextIntent(activityA);
sBuilder.addNextIntent(activityB);
sBuilder.addNextIntent(activityC);
pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );

我没有测试过,这只是我快速研究的结果,如果我错了,我希望有人能纠正我。

于 2012-11-08T17:25:01.107 回答
14

我找到了解决这个问题的另一种方法:使用方法TaskStackBuilder.editIntentAt(int)

前任。

Intent intentC = new Intent(context, ActivityC.class);
intentC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addParentStack(ActivityB.class)
    .addParentStack(ActivityC.class)
    .addNextIntent(intentC);

Intent intentA = sBuilder.editIntentAt(0);
intentA.putExtra(key, value);
Intent intentB = sBuilder.editIntentAt(1);
intentB.putExtra(key, value);
于 2014-06-26T18:02:48.753 回答
9

我一直在努力解决这个问题。我的研究得出了以下解决方案(与@pawelzieba 非常相似,但有一个重要的删除):

Intent activityA = new Intent(context, ActivityA.class);
activityA.putExtra(key, valueA);
Intent activityB = new Intent(context, ActivityB.class);
activityB.putExtra(key, valueB);
Intent activityC = new Intent(context, ActivityC.class);
activityC.putExtra(key, valueC);

TaskStackBuilder sBuilder = TaskStackBuilder.create(this)
    .addNextIntent(activityA);
    .addNextIntent(activityB);
    .addNextIntent(activityC);
PendingIntent pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_UPDATE_CURRENT );

请注意,您不应使用父关联修改清单,并且您不想使用:

sBuilder.addParentStack( ActivityC.class );

否则,您将在新创建的任务中重复 ActivityA 和 ActivityB,这些任务具有没有额外内容的意图。如果您不需要通过额外的意图传递,您可以在清单中添加父关联并调用 addParentStack()。

于 2014-04-24T22:22:09.173 回答