gpt4 book ai didi

java - 根据应用程序是在前台还是后台,通知显示不同

转载 作者:行者123 更新时间:2023-11-29 23:32:17 27 4
gpt4 key购买 nike

我在 Android 上遇到通知问题。每当我的应用程序收到 GCM 消息时,我都会使用下面的代码在设备上生成通知。然而,它产生了意想不到的结果。

public class MyGcmListenerService extends GcmListenerService implements Constants {
private static final String TAG = "MyGcmListenerService";

@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("msg");
sendNotification(message);
}

private void sendNotification(String message) {
NotificationManager notificationManager =
(NotificationManager)getSystemService(Context.NOTIFICATION_SERVICE);
Uri defaultSoundUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
CharSequence name = getString(R.string.gcm_notification_channel_name);
String description = getString(R.string.gcm_notification_channel_description);
int importance = NotificationManager.IMPORTANCE_HIGH;
NotificationChannel channel = new NotificationChannel(GCM_NOTIFICATION_CHANNEL_ID, name,
importance);
channel.setDescription(description);
channel.setLockscreenVisibility(NotificationCompat.VISIBILITY_PUBLIC);
channel.enableVibration(true);
channel.setSound(defaultSoundUri,
new AudioAttributes.Builder()
.setContentType(AudioAttributes.CONTENT_TYPE_SONIFICATION)
.setUsage(AudioAttributes.USAGE_NOTIFICATION_COMMUNICATION_INSTANT)
.build());
notificationManager.createNotificationChannel(channel);
}

NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this,
GCM_NOTIFICATION_CHANNEL_ID)
.setContentText(message)
.setContentTitle("My Title")
.setPriority(NotificationCompat.PRIORITY_HIGH)
.setAutoCancel(true)
.setSound(defaultSoundUri)
.setDefaults(Notification.DEFAULT_VIBRATE | Notification.DEFAULT_SOUND)
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
.setSmallIcon(R.drawable.ic_notification);

notificationManager.notify(0, notificationBuilder.build());
}
}

如果在应用程序打开时收到 GCM 消息(不仅在运行,而且实际上在屏幕上打开),则生成的通知只有标题,不会显示消息。 This screenshot演示了这种情况。此外,如果我在应用程序处于前台时向设备发送多条 GCM 消息,则只会显示一条消息。

如果应用程序关闭或在后台运行时收到消息,生成的通知将仅显示消息,没有标题。 This screenshot并排显示两条消息 - 底部的消息是在前台收到的应用程序,顶部是在后台收到的应用程序。如果应用程序在后台时收到多条消息,则会显示所有消息(与应用程序在前台时发生的情况相反)。 This screenshot显示当应用在后台收到消息时会显示多条消息。

此外,通知仅显示为 heads-up当应用程序在前台时。

最后,如果在前台收到通知,则生成的通知在点击时不会执行任何操作。但是,如果在后台收到,通知会在点击时打开应用程序。对此并没有真正感到困扰,只是认为这可能表明存在问题。

仅供引用:在测试时,我尝试过每次都保持 GCM 消息相同,也尝试改变它。两种情况都给出了相同的结果。

我想弄清楚的是:

  • 无论应用是否在前台,如何都显示标题和消息。这是最重要的。

  • 当应用程序处于后台时,如何让通知显示为提醒。

根据我们的用户,这是该应用程序最重要的功能(该应用程序必须实时通知用户某些事件),只是为了预先阻止任何说不要滥用单挑的回复。

更新:

Bas van Stein 的 answer让我弄清楚为什么只显示标题或消息。

正如他正确指出的那样,当应用程序在后台运行时,GCM 消息由系统处理。这促使我检查用于后端发送消息的脚本。我意识到写这个脚本的人在 GCM 消息的 notification 字段的 title 字段中发送了消息,并且没有 body字段。所以我更正了这个问题,并且通知显示正确(对于后台应用程序)。

这也让我意识到 onMessageReceived 中的行 String message = data.getString("msg"); 正在返回 null .我改变了方法如下:

public void onMessageReceived(String from, Bundle data) {
Bundle notification = data.getBundle("notification");
String title = notification.getString("title");
String message = notification.getString("body");

sendNotification(title, message);
}

然后我将 title 作为参数添加到 sendNotification 并将设置通知标题的行更改为:.setContentTitle(title)。现在,当应用程序位于前台时,通知会正确显示。

此外,我在用作通知 ID 的类中添加了一个 static int(每次递增),因此现在可以正确显示多个通知。

还是没有解决:

当应用程序处于后台时,我仍然无法让通知显示为提示。我尝试将 "priority": "high" 添加到 GCM 消息 notification 有效负载中,但这没有任何效果 - 显然这是 GCM 通知的默认设置。

最佳答案

这个答案只是完整解决方案的一部分,但我们开始吧:

第一个问题,后台和前台通知似乎是由两个不同的函数生成的,您可以通过在代码中应用断点并附加调试器来测试这一点。您可能会看到后台通知未触发此代码中的断点。也许您错过了 list 服务?

第二个问题,只显示一个通知是因为这一行:

notificationManager.notify(0, notificationBuilder.build());

这里的0是通知id,如果你用相同的id创建多个通知,它会覆盖通知而不是显示一个新通知。

第三个问题,应用程序未在通知选项卡上打开,是因为您在代码中生成的通知没有附加 Intent 。

您可以将类似这样的内容用于 Intent :

intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
PendingIntent pIntent = PendingIntent.getActivity(this, 0, intent,
PendingIntent.FLAG_ONE_SHOT);
notificationBuilder.setContentIntent(pIntent);

当您点击通知时将调用 Intent ,这可以是任何 Intent ,例如您可以打开一个特殊 Activity 。

希望这能给您带来正确的方向。

关于java - 根据应用程序是在前台还是后台,通知显示不同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52534058/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com