TaskStackBuilder和额外的后退堆栈
我试图使用TaskStackBuilder与通知来创build后退button通过后退堆栈。 我的应用程序的正常stream程:
- 活动A从启动器启动。
- 用户从A中select一个项目,启动B,带有额外的加载内容。
- 用户从B中select一个项目,这将启动C与extras什么加载。
有时,在用户不使用我的应用程序的后台更新后,我生成了一个通知。 如果他们点击这个通知,它会启动Activity C,跳过A和B.我试图按照devise原则创build一个后退堆栈,所以当他们按回时,它将转到Activity B而不是主屏幕。 我的问题是,活动B需要额外的启动意图,告诉它从数据库中抓取什么。
我目前的TaskStackBuilder代码:
TaskStackBuilder sBuilder = TaskStackBuilder.create( this ); sBuilder.addParentStack( ActivityC.class ); sBuilder.addNextIntent( launchIntent ); pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );
点击通知启动Activity C就好了,但是当我按回来时,它会爆发一个来自我的ContentProvider的IllegalArgumentException
,因为Activity B不知道要请求的ID。 有没有办法把这个额外的东西放到后面的堆栈里,还是我卡住了?
这一行:
sBuilder.addParentStack( ActivityC.class );
添加在<meta-data>
AndroidManifest.xml
中为ActivityC
声明的所有父项。 我不知道是什么,我没有用过。 我怀疑你需要它。
这一行将意图添加到数组中:
sBuilder.addNextIntent(launchIntent);
那么意图数组被用来创buildPendingIntent,可能与PendingIntent.getActivities ,我找不到执行,然后开始在某处与Context.startActivities 。
我认为你只需要创build一套意图,你可以添加额外的:
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);
并添加到build设者:
sBuilder.addNextIntent(activityA); sBuilder.addNextIntent(activityB); sBuilder.addNextIntent(activityC); pIntent = sBuilder.getPendingIntent( 0, PendingIntent.FLAG_ONE_SHOT );
我没有testing过,这只是我的快速研究的结果,我希望有人会纠正我,如果我错了。
我发现另一种方法来解决这个问题:使用方法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);
我一直在努力。 我的研究产生了以下解决scheme(非常类似于@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在新创build的任务,没有额外的意图。 如果你不需要传递额外的意图,你可以在清单中添加父关联,并调用addParentStack()。