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

时间:2018-07-04 15:09:00

标签: android android-intent android-manifest android-notifications

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

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

这是创建Intent的方式。

Intent intent = new Intent(context, notificationClass);
return PendingIntent.getActivity(context, 0, intent, 0);

请注意,从通知中启动的Activity类在运行时(notificationClass)是已知的。对于其他情况,有一个库公开了View,该库在膨胀时会创建Service,而后者会创建Notification,并且由于任何Activity都可以包含View,请求Class,以便当用户单击通知时恢复正确的Activity

然后,intent被添加到notificationBuilderNotificationCompat.Builder)。

notificationBuilder.setContentIntent(intent);

在应用程序进入后台然后单击通知时实施此操作,它将创建Activity的新副本,而不是恢复它。

出于测试目的,通过将Activity(预先知道)的launchMode添加到{{1},得到了预期的行为(单击通知后恢复Activity } singleTop文件中。但是我无法使其以任何其他方式工作。

由于这些限制,我想知道在创建AndroidManifest.xml时是否有可能以编程方式获得相同的行为。我尝试了很多Notification标志组合(也IntentaddFlags),但是没有运气。

是否有可能创建一个setFlags以使其表现出来?

非常感谢!

正在给https://stackoverflow.com/users/769265/david-wasser回答了许多与Intent相关的类似问题

2 个答案:

答案 0 :(得分:0)

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

PackageManager pm = getPackageManager();
Intent intent = pm.getLaunchIntentForPackage(packageName);
return PendingIntent.getActivity(context, 0, intent, 0);

packageNameAndroidManifest.xml中软件包的名称。

这“启动”了任务的根Activity,它实际上不会启动任何东西,而只是将现有任务置于前台。

答案 1 :(得分:0)

经过反复试验和测试,我使用以下方法组合使其工作

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);

/**
 * (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
 */

因此,显然pm.getLaunchIntentForPackage(context.getPackageName());返回了Intent,该{限于context.getPackageName()中的组件,然后需要将包显式设置为null,以便考虑所有组件。 / p>

尽管我不太确定^。 FWIW添加它,解决了问题\\ _(ツ)_ /¯