从通知中恢复活动

我在状态栏中为我的应用程序提供了一个通知

Notification notification = new Notification(R.drawable.icon, null, System.currentTimeMillis()); Intent notificationIntent = new Intent(this.parent, MainActivity.class); PendingIntent contentIntent = PendingIntent.getActivity(this.parent, 0, notificationIntent, 0); ... notification.flags = Notification.FLAG_ONGOING_EVENT; mNotificationManager.notify(NOTIFICATION_ID, notification); 

这个问题是,当你从应用程序按下主页button(推到后台),然后按从状态栏访问的列表中的通知,它启动一个新的活动副本。 我想要做的就是恢复应用程序(就像当你长按主页button并按下应用程序的图标)。 有没有一种方法来创build一个意图来做到这一点?

我已经通过在androidManifest.xml文件singleTask activity的launchMode更改为launchMode来解决此问题。

这个属性的默认值是standard ,它允许任意数量的实例运行。

“singleTask”和“singleInstance”活动只能开始一项任务。 他们总是在活动堆栈的根源。 而且,设备一次只能容纳一个活动的实例 – 只有一个这样的任务。 […]

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

您可以在Android开发者指南中find详细的解释

我希望这有帮助

我刚刚发现了一个解决scheme这个问题:我创build了getPreviousIntent方法,并将其提供给PendingIntent的所有:

 private Intent getPreviousIntent(Intent newIntent) { final ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); final List<ActivityManager.RecentTaskInfo> recentTaskInfos = am.getRecentTasks(1024,0); String myPkgNm = getPackageName(); if (!recentTaskInfos.isEmpty()) { ActivityManager.RecentTaskInfo recentTaskInfo; for (int i = 0; i < recentTaskInfos.size(); i++) { recentTaskInfo = recentTaskInfos.get(i); if (recentTaskInfo.baseIntent.getComponent().getPackageName().equals(myPkgNm)) { newIntent = recentTaskInfo.baseIntent; newIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK); } } } return newIntent; } 

我有一个类似的问题,正确的方式来处理这是使用标志:Intent.FLAG_ACTIVITY_CLEAR_TOP和Intent.FLAG_ACTIVITY_SINGLE_TOP像这样

 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 

从这个文档将会:

FLAG_ACTIVITY_CLEAR_TOP

如果已设置,并且正在启动的活动已在当前任务中运行,则不会启动该活动的新实例,而是closures其上的所有其他活动,并将此Intent交付给(现在开启顶端)旧活动作为一个新的意图。

FLAG_ACTIVITY_SINGLE_TOP

如果设置,如果活动已经在历史堆栈顶部运行,则活动将不会启动。

将此行添加到应用的清单文件中的相应活动。

 android:launchMode="singleTask" 

例如:

 <activity android:name=".Main_Activity" android:label="@string/title_main_activity" android:theme="@style/AppTheme.NoActionBar" android:launchMode="singleTask" /> 

我用:

 notificationIntent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TOP); notificationIntent.setAction(Intent.ACTION_MAIN); 

不知道这些是你需要设置的值,但答案是在这些方法/标志。

你需要像发射器一样开始你的活动。 请参阅: 从通知中恢复应用程序和堆栈