清除任务并在单击通知时导航到主要活动

时间:2015-05-08 14:26:52

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

我有以下方案,我正在尝试修复:

  1. 应用程序包含两个活动:Activity_A和Activity_B
  2. 目前用户位于Activity_B
  3. 收到通知活动_A
  4. 的通知

    无论其 当按下后退键时,从App导航出来如下: Activity_A(来自通知) - > Acivity_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); 
    

3 个答案:

答案 0 :(得分:1)

您是否尝试设置singleTask而不是singleInstance? 此外,您可以尝试实现onActivityResult,以便在从activityA返回时完成activityB。

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

修改

为了更好地理解singleTask和singleInstance之间的区别,您可以从launchMode源文档中查看以下描述。

  

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

我能看到的唯一警告就是下面的一个警告,如果你知道自己在做什么,并且确定你想要什么,那么在我看来并不那么重要。

  

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

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

答案 1 :(得分:0)

没有什么可以只在你的B_Activity中添加这个功能。只要你离开就完成活动。这是一种很好的做法。

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

答案 2 :(得分:0)

接受的答案并不好。对此行为使用特殊启动模式是不正确的,即使它可能适用于此特定情况。一般情况下,使用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_TASK的{​​{3}}对此也很清楚。它说:

  

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