Android 如何以编程方式从通知恢复活动?

Android 如何以编程方式从通知恢复活动?,android,android-intent,android-manifest,android-notifications,Android,Android Intent,Android Manifest,Android Notifications,我已经读了很多关于这个话题的答案,但是没有一个能解决这个问题 应用程序正在运行“前台服务”,因此需要通知 这就是创建意图的方式 Intent intent = new Intent(context, notificationClass); return PendingIntent.getActivity(context, 0, intent, 0); 请注意,从通知启动的活动类在运行时是已知的(notificationClass)。对于额外的上下文,有一个库公开了一个视图,当该视图膨胀时,将创

我已经读了很多关于这个话题的答案,但是没有一个能解决这个问题

应用程序正在运行“前台服务”,因此需要通知

这就是创建
意图的方式

Intent intent = new Intent(context, notificationClass);
return PendingIntent.getActivity(context, 0, intent, 0);
请注意,从通知启动的
活动
类在运行时是已知的(
notificationClass
)。对于额外的上下文,有一个库公开了一个
视图
,当该视图膨胀时,将创建
服务
,该服务将创建
通知
,因为任何
活动
都可能包含
视图
,请求
,以便在用户单击通知时恢复正确的
活动

然后,将
intent
添加到
notificationBuilder
NotificationCompat.Builder

当应用程序转到后台,然后单击通知时,它会创建
活动的新副本,而不是恢复该活动

出于测试目的,我通过在
AndroidManifest.xml
文件中将
活动的
launchMode
(事先知道)添加到
singleTop
中,获得了预期的行为(单击通知后,
活动将恢复)。但我无法以任何其他方式让它工作

有了这些约束,我想知道在创建
通知时是否有可能以编程方式获得相同的行为。我尝试了一系列
Intent
标志组合(也是
addFlags
vs
setFlags
),但运气不佳

是否有可能创建一个
意图
以按照所解释的方式行事

非常感谢


回答了许多类似的
意图
相关问题的抄送

不确定我是否完全理解,但如果您只是想将现有任务置于前台(这与从最近的任务列表中选择任务相同),请尝试以下操作:

PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
return PendingIntent.getActivity(context, 0, intent, 0);
packageName
AndroidManifest.xml
中的包的名称


这将“启动”任务的根
活动
,它实际上不会启动任何东西,只会将现有任务带到前台。

经过一些尝试和错误测试,我使用以下方法组合使其工作

PackageManager pm = context.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(context.getPackageName());
intent.setPackage(null);
return PendingIntent.getActivity(context, 0, intent, 0);enter code here
这里的关键部分是
intent.setPackage(null)

显然,
pm.getLaunchIntentForPackage(context.getPackageName())
返回一个
意图
,该意图仅限于
上下文中的组件。之后需要getPackageName()
并将包显式设置为
null
,以便考虑所有组件


不过我不完全确定。FWIW添加它,解决了问题“\_(ツ)_/“

当用户单击通知时,是否只想将现有任务置于前台(无论其处于何种状态)?或者您是否明确希望启动特定的
活动
?@DavidWasser我想要的是从通知中恢复
活动
,即与打开最近的任务列表并选择一个
活动
来恢复相同的场景。这有意义吗?我猜是一种混合,因此将现有任务带到前台nd但对于特定的
活动
。如果您需要进一步的澄清,请告诉我。感谢您的帮助!我已经测试了它,但它没有按照您解释的那样工作。它正在创建“主活动”的新副本(即将
main
LAUNCHER
作为操作和类别的副本)也就是说,当创建A>B>C活动时,我想要的是返回到C(保留backbackback)当点击通知时,现在我得到的是A>B>C>A,这有意义吗?再次感谢!当我说“现在”时,我指的是你在上面分享的代码片段。如果现在更清楚,你知道如何在以编程方式点击通知后返回C吗?比如,如果你选择一个
活动
从最近的scre继续恩。如果您认为不可能,或者您有解决办法,也请告诉我。我认为这是一个常见的用例,但似乎不是:(谢谢!您可能看到了一个严重的Android错误。这会导致根
活动在某些情况下重新启动。要检查,请“强制关闭”您的应用程序,然后单击主屏幕上的图标再次打开。不要直接从安装程序或AndroidStudio打开应用程序。查看问题是否消失。如果没有,请发布您的清单。您描述的行为没有任何意义。我刚刚测试了您的建议,但它没有按照您提到的那样工作。它正在创建一个新的应用程序根目录
Activity
并将其放在顶部。在这里,您可以找到清单,我还创建了一个带有建议更改的分支,因此您可以自己测试它,例如,如果您打开应用程序并导航到
WaypointNavigationActivity
,然后按home按钮,然后单击通知,
MainActivityWaypointNavigationActivity
时,code>被创建并放置在顶部。请告诉我这是否合理以及是否可以实现。再次感谢@DavidWasser
PackageManager pm = context.getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(context.getPackageName());
intent.setPackage(null);
return PendingIntent.getActivity(context, 0, intent, 0);enter code here
/**
 * (Usually optional) Set an explicit application package name that limits
 * the components this Intent will resolve to.  If left to the default
 * value of null, all components in all applications will considered.
 * If non-null, the Intent can only match the components in the given
 * application package.
 *
 * @param packageName The name of the application package to handle the
 * intent, or null to allow any application package.
 *
 * @return Returns the same Intent object, for chaining multiple calls
 * into a single statement.
 *
 * @see #getPackage
 * @see #resolveActivity
 */