返回通知创建活动的主要活动

Tim*_*mmm 26 android

我正在尝试实现此处描述的行为,其中通知(或其他)在您的应用中启动"内部"活动,然后当用户按下它时进入我的"主页"活动.

Android文档说

对于"后退"按钮,您应该通过在任务的后台堆栈中插入应用程序最顶层屏幕的完整向上导航路径,使导航更具可预测性.这允许忘记他们如何进入您的应用程序的用户在退出之前导航到应用程序的最顶层屏幕.

有没有一个好方法来实际做到这一点?关于Stackoverflow的其他问题建议启动主要活动,意图告诉它开始内部活动,但这似乎是一个巨大的黑客,我有点怀疑谷歌会在Gmail中使用,我认为有一个不错的方法,给定他们在倡导这种行为.

那么有一种非黑客的方法吗?

Tim*_*mmm 69

啊哈,我只需要用PendingIntent.getActivities()而不是getActivity().另外值得一提的是TaskStackBuilder

这是一些代码:

    Intent backIntent = new Intent(ctx, MainActivity.class);
    backIntent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);

    Intent intent = new Intent(ctx, ConversationActivity.class);
    intent.putExtra("whatever", whatever);
    final PendingIntent pendingIntent = PendingIntent.getActivities(ctx, UNIQUE_REQUEST_CODE++,
            new Intent[] {backIntent, intent}, PendingIntent.FLAG_ONE_SHOT);
Run Code Online (Sandbox Code Playgroud)

刚试过它.它就像一个魅力.我最初怀疑如果应用程序已经运行可能会出现问题,并且您会收到通知.即你说活动堆栈是(最右边的):

[MainActivity] [SomeActivity]
Run Code Online (Sandbox Code Playgroud)

然后单击通知ConversationActivity.你会得到:?

[MainActivity] [SomeActivity] [MainActivity] [ConversationActivity]
Run Code Online (Sandbox Code Playgroud)

好吧,事实证明你神奇地得到了

[MainActivity] [SomeActivity] [ConversationActivity]
Run Code Online (Sandbox Code Playgroud)

这是我想要的,但我不知道它是如何做到的.我没有在任何活动上设置任何特殊选项.那好吧!

  • 谢谢; 这对我有用,而`TaskStackBuilder`似乎不起作用.然而,你的代码导致一个奇怪的情况:如果我通过启动器打开`MainActivity`然后从通知中打开动作,按下后退按钮返回到'MainActivity`后,按后退按钮导致它转到再次'MainActivity`.像这样:`[MainActivity] [MainActivity] [ConversationActivity]`.我通过将第二行代码更改为`backIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK)来修复它. (3认同)
  • @bompf,这可能是因为在 `PendingIntent.getActivities` 中使用了 `PendingIntent.FLAG_ONE_SHOT`。我建议改为`PendingIntent.FLAG_CANCEL_CURRENT`。 (2认同)

Pet*_*ano 8

有一个关于如何做到这一点的新指南,它提出了一些与上述答案略有不同的做法:

https://developer.android.com/guide/topics/ui/notifiers/notifications.html#NotificationResponse

请注意,实际上不要0getPendingIntent. 对我来说,任何不是 0 的数字都有效,但 0 会导致后退按钮进入启动器。