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
vssetFlags
),但运气不佳
是否有可能创建一个意图
以按照所解释的方式行事
非常感谢
回答了许多类似的意图
相关问题的抄送不确定我是否完全理解,但如果您只是想将现有任务置于前台(这与从最近的任务列表中选择任务相同),请尝试以下操作:
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按钮,然后单击通知,MainActivity当我想要恢复WaypointNavigationActivity
时,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
*/