TaskStackBuilder和后台堆栈的附加功能

时间:2012-10-30 22:47:06

标签: android

我正在尝试使用TaskStackBuilder通知来为后退按钮创建后备堆栈。我的应用程序的正常流程:

  1. 活动A从启动器启动。
  2. 用户从A中选择一个项目,该项目会启动B以及要加载的内容。
  3. 用户从B中选择一个项目,这将启动C以及要加载的内容。
  4. 有时,在用户未使用我的应用后进行后台更新后,我会生成通知。如果他们单击此通知,则会启动活动C,跳过A和B.我正在尝试遵循设计准则并创建一个后备堆栈,因此当他们按下它时将转到活动B而不是主屏幕。我的问题是,活动B需要额外的启动意图告诉它从数据库中获取什么。

    我当前的TaskStackBuilder代码:

    TaskStackBuilder sBuilder = TaskStackBuilder.create( this );
    sBuilder.addParentStack( ActivityC.class );
    sBuilder.addNextIntent( launchIntent );
    
    pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );
    

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

3 个答案:

答案 0 :(得分:56)

这一行:

sBuilder.addParentStack( ActivityC.class );

ActivityC的{​​{1}}中添加为AndroidManifest.xml声明的所有父母。我不知道它是什么,我没有用过它。我怀疑你需要它。

此行为数组添加了意图:

<meta-data>

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

我认为你只需要创建一组意图,在那里你可以添加额外内容:

sBuilder.addNextIntent(launchIntent);

并将它们添加到构建器:

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);

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

答案 1 :(得分:13)

我找到了解决此问题的另一种方法:使用方法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);

答案 2 :(得分: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()。