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

应用程序在后台或未运行时,推送通知工作不正确

奚修伟
2023-03-14

我正在使用Firebase云消息发送推送通知。

public class FireBaseMessageService extends FirebaseMessagingService {


@Override
public void onMessageReceived(RemoteMessage remoteMessage) {
    Log.e("TAG", "From: " + remoteMessage.getFrom());
    Log.e("TAG", "Notification Message Body: " + remoteMessage.getData().get("CardName")+"  :  "+remoteMessage.getData().get("CardCode"));
    sendNotification(remoteMessage.getNotification().getBody());
}


private void sendNotification(String messageBody) {
    Intent intent = new Intent(this, StartActivity.class);
    intent.addFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
    PendingIntent pendingIntent = PendingIntent.getActivity(this, 0 /* Request code */, intent,
            PendingIntent.FLAG_ONE_SHOT);

    Uri defaultSoundUri= RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION);
    NotificationCompat.Builder notificationBuilder = new NotificationCompat.Builder(this)
            .setSmallIcon(R.mipmap.ic_launcher_final)
            .setContentTitle("Notification")
            .setContentText(messageBody)
            .setTicker("Test")
            .setAutoCancel(true)
            .setDefaults(Notification.DEFAULT_SOUND)
            .setContentIntent(pendingIntent);

    NotificationManager notificationManager =
            (NotificationManager) getSystemService(Context.NOTIFICATION_SERVICE);

        notificationManager.notify(0 /* ID of notification */, notificationBuilder.build());
    }
}

FireBaseInstanceServer:

public class FirebaseInstanceService extends FirebaseInstanceIdService {


@Override
public void onTokenRefresh() {
    // Get updated InstanceID token.
    String refreshedToken = FirebaseInstanceId.getInstance().getToken();
    Log.e("TAG", "Refreshed token: " + refreshedToken);

    // TODO: Implement this method to send any registration to your app's servers.
    sendRegistrationToServer(refreshedToken);

}

private void sendRegistrationToServer(String token) {


      // Add custom implementation, as needed.
        Log.e("TAG", "Refreshed token2: " + token);
    }
}

AndroidManifest中声明:

<service
    android:name=".util.notifications.FireBaseMessageService">
    <intent-filter>
        <action android:name="com.google.firebase.MESSAGING_EVENT"/>
    </intent-filter>
</service>

<service
    android:name=".util.notifications.FirebaseInstanceService">
    <intent-filter>
        <action android:name="com.google.firebase.INSTANCE_ID_EVENT"/>
    </intent-filter>
</service>

问题是,当应用程序运行时,ticker显示良好,通知带有默认声音,但当应用程序在后台或未运行时,通知没有任何声音,而ticker不显示在状态栏中。
为什么会出现这种情况,我如何修复它?

共有1个答案

百里骏
2023-03-14

使用FCM,您可以指定一个POST负载发送到https://FCM.googleapis.com/FCM/send。在该负载中,您可以指定数据通知键,或同时指定这两个键。

如果你的负载只包含一个data键,你的应用程序将自己处理所有的推送消息。例如。它们都传递给您的OnMessageReceived处理程序。

如果您的负载包含通知键,则只有当您的应用程序处于活动状态/处于前台时,您的应用程序才会处理推送消息本身。如果它不是(所以它在后台,或者完全关闭),FCM将使用您放入notification键负载中的值来处理为您显示通知。

看起来您希望自己处理FCM消息,以便可以更多地自定义通知等,因此最好不要在POST有效负载中包含notification键,这样所有推送消息都传递给您的OnMessageReceived

您可以在此处阅读有关它的详细信息:
高级消息传递选项
下游消息语法

 类似资料:
  • 我想为一个聊天应用程序实现FCM推送通知服务,我遵循Firebase文档中的步骤,当通知从Firebase控制台发送到我的设备时,我会得到通知。当我尝试使用http post to https://FCM.googleapis.com/FCM/send通过FCM将通知通过服务器端发送到设备时: 当应用程序处于活动状态并且我正在将此通知发送到我的设备时,Im在我的控制台日志中收到以下消息,所以我认为

  • 下面是一个代码片段,它在测试中起作用,但由于发布到存储总是返回NULL:

  • 当应用程序在后台时,如何更新包含数据负载的Firebase推送通知?有没有办法在通知中指定通知id给Firebase API? 完整的项目在github https://github.com/akshatashan/FireBaseCloudMessagingDemo中

  • 我正在尝试在windows Phone7.5中实现推送通知 更新: 我知道通道活动时间长达30天,当我只使用模拟器时是否相同? 应用程序应与通道相关联,以便接收通知,即使在应用程序未运行时,如果通知通道处于活动状态,则应用程序也将接收toast

  • 我有问题保存我创建的一些obj,从FireBase推送通知系统开始到磁盘使用GSon库。 我要做的:当收到推送通知时,创建一个obj,添加到一个容器并保存到磁盘。GUI将读取并使用它来创建一个类似facebook的通知列表。只有当应用程序没有运行或在后台时,一个通知图标也会显示在托盘中。 我已经有了:如果应用程序在前台运行,所有的工作。如果应用程序没有运行或在后台,通知图标会出现在托盘上,但不会执

  • 我试图实现推送通知与反应本机与此插件反应本机推送通知。我成功的是在应用程序运行时收到通知(在前台),但我想做的是在应用程序关闭时收到通知(后台),不运行,当我收到通知进入应用程序时。 我的密码 我正在使用firebase函数发送通知 AndroidManifest。xml 正如我之前所说的,只有当应用程序运行时,当我使用firebase http功能发送时,我才能成功获得通知。我现在只在Andro