【问题标题】:TaskStackBuilder and extras for the back stackTaskStackBuilder 和后栈的附加功能
【发布时间】:2012-10-30 22:47:05
【问题描述】:

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

  1. Activity 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 就好了,但是当我按下它时,它会从我的 ContentProvider 中以 IllegalArgumentException 爆炸,因为 Activity B 不知道要请求什么 ID。有什么办法可以把这个额外的东西放到后面的堆栈中,还是我被卡住了?

【问题讨论】:

    标签: android


    【解决方案1】:

    这一行:

    sBuilder.addParentStack( ActivityC.class );
    

    AndroidManifest.xml 中添加为ActivityC 声明的所有父级<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 );
    

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

    【讨论】:

    • 有趣的方法,我什至没有想过尝试。我会试一试,看看它是否有效,可能需要几天才能有时间,但我会告诉你。感谢您的想法!
    • 我不得不删除 addParentStack,然后我收到了我发送的附加内容。奇怪,因为使用 addParentStack 的代码来自谷歌的例子
    • 如果我使用 PendingIntent.FLAG_UPDATE_CURRENT 而不是 PendingIntent.FLAG_ONE_SHOT 后退按钮单击不会从 C 导航到活动 B。为什么?
    【解决方案2】:

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

    【讨论】:

    • 点击通知时,我无法在 ActivityA 端检索 Intent extra :(
    【解决方案3】:

    我一直在努力解决这个问题。我的研究得出了以下解决方案(与@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()。

    【讨论】:

    • 你是对的,那行添加了一个重复的堆栈,没有额外的包。谢谢!
    猜你喜欢
    • 1970-01-01
    • 2015-12-31
    • 2016-09-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-20
    • 2015-06-20
    相关资源
    最近更新 更多