当前位置: 首页 > 知识库问答 >
问题:

使用通知打开Android应用程序

俞俊逸
2023-03-14

我正在使用Firebase(FCM)向用户显示推送通知,但我遇到了一个奇怪的问题。

我的代码适用于以下场景(使用FirebaseMessagingService):

  • 前台应用 - 在 onReceive() 中接收数据并在应用内显示弹出窗口。
  • 后台应用 - 在 onReceive() 中接收数据并为用户显示通知。如果单击此按钮,应用程序将被带回前台。在LauncherActivity中收到此目的的意图,然后是一个finish()调用,它将我带到我已经打开的任何活动。
  • 应用程序完全关闭 - 与背景相同。应用程序将被启动,意图将在LauncherActivity中处理,然后调用finish()。

这就是有趣的地方:

  • 应用程序完全关闭 -
Intent mainIntent = getPackageManager().getLaunchIntentForPackage(getPackageName()); 
if (mainIntent != null) {
    mainIntent.addCategory(NOTIFICATION_CATEGORY);
    mainIntent.putExtra(.........);
}
PendingIntent pendingMainIntent = PendingIntent.getActivity(this, SERVICE_NOTIFICATION_ID, mainIntent, PendingIntent.FLAG_UPDATE_CURRENT);

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(context, context.getString(R.string.default_notification_channel_id));
notificationBuilder.setContentIntent(pendingMainIntent);
//.....icon, color, pririty, autoCancel, setDefaults, setWhen, setShowWhen, contentText, setStyle

NotificationManager notificationManager = (NotificationManager) this.getSystemService(Context.NOTIFICATION_SERVICE);
if (notificationManager != null) {
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
        NotificationChannel channel = new NotificationChannel(
            getString(R.string.default_notification_channel_id),
            getString(R.string.default_notification_channel),
            NotificationManager.IMPORTANCE_HIGH
        );
        notificationManager.createNotificationChannel(channel);
        notificationBuilder.setChannelId(getString(R.string.default_notification_channel_id));
    }
    notificationManager.notify(SERVICE_NOTIFICATION_ID, notificationBuilder.build());
}

我将不胜感激任何想法。谢谢。

共有1个答案

郎星汉
2023-03-14

当你第一次启动一个应用程序时,Android会记住用来启动它的< code>Intent。通常,当您从主屏幕启动应用程序时,这是一个包含ACTION=MAIN和CATEGORY=LAUNCHER的< code>Intent。如果你的应用程序转到后台(无论什么原因),用户稍后点击主屏幕上的图标,将使用相同的启动< code >意图。Android将此与用于首次启动应用程序的< code>Intent进行匹配,如果匹配,Android不会启动新的< code>Activity,它只是将包含应用程序的任务从后台带到前台,无论它在移动到后台时处于什么状态。在正常情况下,这正是您想要的行为(也是用户所期望的)。

然而,当应用程序第一次从< code >通知中启动时,这可能会把事情弄糟。对你来说,这就是你所看到的。您从< code >通知启动应用程序,android会记住所使用的< code >意图(从< code >通知),当您稍后启动应用程序(再次从< code >通知)时,Android会将< code >通知中的< code >意图与首次启动应用程序时使用的< code >意图进行匹配,并认为您想要将现有应用程序任务从后台带到前台。

有几种方法可以解决这个问题,具体取决于您想要的行为。最好的办法可能是不要从通知启动您的根活动(ACTION=MAIN和CATEGORY=LAUNCHER)。相反,启动不同的活动并让活动确定它下一步应该做什么(即:重定向到根活动或其他东西,取决于您的应用程序的状态)。您还应该在通知中的Intent上设置NO_HISTORYEXCLUDE_FROM_RECENTS标志。这将确保Android不会将此Intent记住为启动应用程序的那个。

 类似资料:
  • 我正在开发一个应用程序,它使用GCM进行推送通知。 我的问题是关于如何从用户单击通知时打开/启动应用程序。我有两种潜在的情况: A)应用程序已打开,并且驻留在前台或后台,无论哪种方式,我的GCM工作正常,GCM消息到达用户点击通知并意图启动相关活动(通过通知等待意图传递)。 b)应用程序关闭,收到通知,用户再次点击通知,并试图开始相关活动,这是它变得混乱的地方。该应用程序有一个后端,所以现在需要自

  • 在通知部分,我有这个通知不打开APP的问题。有什么建议吗?我试了很多可能性,但没有...我错在哪里?请帮帮我。

  • 使用以下代码时: 以下用户行为创建了一种不一致的通知方法: null null

  • 我的应用程序的通知工作良好,在后台和前台接收通知,使用Firebase原生插件。现在,我的客户端需要在收到通知时打开应用程序,而不需要任何用户迭代。 我找到了这个,但没有正确的答案。 在调试中,我意识到通知是通过FireBaseInstanceIDReceiver广播接收的。所以,我试过: 修改 plugins/cordova-plugin-firebase-lib/plugin.xml 我的问题

  • 手动设置“自动取消”标志 改用builder.build() notificationmanger取消(id)和/或取消所有 使用NotificationCompat.Builder 对setContentIntent使用常规启动意图,而不是手动调用StartActivity

  • 我知道我可以设置click_action,但这只是为了定制哪些活动将在通知点击时启动,我需要一些将在通知收到时自动启动的东西。 我尝试了quick start messaging firebase示例,其中有一个onMessageReceived()方法,但它仅在应用程序处于前台时才起作用。是否有一些东西将执行同时应用程序在后台?GCM可以通过直接从接收到通知时调用的广播接收器启动活动意图来完成我