【问题标题】:Clearing task and navigate to main activity upon clicking notification单击通知后清除任务并导航到主要活动
【发布时间】:2015-05-08 14:26:51
【问题描述】:

我正在尝试解决以下情况:

  1. 应用程序包含两个活动,Activity_A 和 Activity_B
  2. 当前用户位于Activity_B
  3. 收到导致 Activity_A 的通知

但是 当点击返回键时,从 App 中导航出来如下: Activity_A(来自通知)-> Activity_B-> Activity_A-> 应用关闭。

我想要实现的是,点击通知后,Activity_B 将完成,并且同一任务中的 Activity_A 将呈现给用户。

我经历了许多几乎描述相同场景的答案和问题,所有答案实施试验都没有解决我的问题。

让我得到我想要的一件事是,如果我在我的主要活动中设置 android:launchMode="singleInstance" 但随后每次调用活动都好像启动了一个新应用程序。

您可以在下面找到一些代码:

final Intent notificationIntent = new Intent(getApplicationContext(), MyDevices.class);
notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK);

final PendingIntent pendingIntent = PendingIntent.getActivity(getApplicationContext(), 0, notificationIntent,0);
final Notification notification = new Notification.Builder(
        getApplicationContext())
        .setSmallIcon(R.drawable.ic_launcher)
        .setContentTitle(mNotificationTitle)
        .setOngoing(false)
        .setContentText(mNotificationMessage)
        .setContentIntent(pendingIntent)
        .setAutoCancel(true)
       .setDefaults(Notification.DEFAULT_ALL).build();

notificationManager.notify(1,notification); 

【问题讨论】:

标签: android android-intent android-pendingintent back-stack


【解决方案1】:

您是否尝试过设置 singleTask 而不是 singleInstance? 您也可以尝试在从activityA返回时实现onActivityResult来完成activityB。

如果没有,我建议您查看我的库以处理活动导航:https://github.com/yayaa/TheActivityManager


编辑:

要更好地了解 singleTask 和 singleInstance 之间的区别,您可以查看 launchMode 源文档中的以下说明。

“singleTask”和“singleInstance”模式也仅在一个方面彼此不同:“singleTask”活动允许其他活动成为其任务的一部分。它始终位于其任务的根部,但其他活动(必须是“标准”和“singleTop”活动)可以启动到该任务中。另一方面,“singleInstance”活动不允许其他活动成为其任务的一部分。这是任务中的唯一活动。如果它启动另一个活动,则该活动被分配给不同的任务——就好像 FLAG_ACTIVITY_NEW_TASK 在意图中一样

我能看到的唯一警告是以下警告,如果您知道自己在做什么,并且确定自己想要什么,这对我来说似乎并不重要。

singleTask 和 singleInstance — 不适用于大多数应用程序,因为它们会导致用户可能不熟悉的交互模型,并且与大多数其他应用程序非常不同。

让您的应用程序针对多个用例进行测试,应该没问题。由于您的应用程序收到推送通知,我认为这是您应该采用的方式。

【讨论】:

  • 看来 singleTask 成功了,很难相信它就这么简单。关于我在意图上设置的标志。我应该添加任何内容还是保持原样?另外,singleTask 是最佳实践吗?根据developer.android.com/guide/topics/manifest/…,关于这些启动模式的警告标志太多
  • 其实不是。如果应用程序已在运行,则不应显示通知。你可以用其他方式处理它,不过我不确定你的情况是什么。
  • 大多数已知的应用程序都会在您使用应用程序本身时显示通知,因此必须有一种解决方案来处理这种情况而不使用这些启动模式。你知道我怎样才能完成与运行 singleTask 相同的行为吗?
  • 我再次挖掘了您提供的链接,我认为使用 singleTask 是可以的,只要确保在大多数情况下都对其进行测试。请查看我的更新答案。
  • 感谢您的详细回答,我用单任务测试了我的应用程序,一切都按预期工作。目前这是我将采用的解决方案
【解决方案2】:

没有什么花哨的,只需在您的 B_Activity 中添加此功能即可。只要你离开它就完成活动。这是一个很好的做法。

protected void onUserLeaveHint() {
    try{
        super.onUserLeaveHint();
        finish();
    }catch(Exception ex){
        //Something went wrong.
    }
}

【讨论】:

  • 这和结束活动onPause一样吗?
  • 不,它不一样。@yahya
【解决方案3】:

接受的答案不好。对此行为使用特殊启动模式是不正确的,即使它可能适用于这种特定情况。一般来说,使用singleTasksingleInstance 启动模式不是正确的方法,而且通常会导致比解决的问题更多的问题。

您不需要任何特殊的启动模式来处理这个问题。你只是缺少Intent.FLAG_ACTIVITY_NEW_TASK。这应该可以在不使用任何特殊启动模式的情况下正常工作,只需像这样创建通知 Intent:

final Intent notificationIntent = new Intent(getApplicationContext(),
                      MyDevices.class);
notificationIntent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TASK |
                            Intent.FLAG_ACTIVITY_NEW_TASK);

Intent.FLAG_ACTIVITY_CLEAR_TASKdocumentation 也很清楚这一点。它说:

如果在传递给 Context.startActivity() 的 Intent 中设置,此标志将 导致与活动相关联的任何现有任务 在活动开始之前被清除。也就是活动 成为一个空任务的新根,任何旧的 活动结束。 这只能与 FLAG_ACTIVITY_NEW_TASK。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-06-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多