当应用程序被杀时,onMessageReceived()没有被调用?

时间:2018-01-31 07:54:52

标签: android firebase push-notification firebase-cloud-messaging

我正在使用Firebase向我的应用发送推送通知。我的应用支持到API级别27.我正在使用FirebaseMessagingService来接收通知。在onMessageReceived()方法中,我正在获取数据有效负载并在托盘中创建自己的通知。从控制台我只发送数据有效负载,因为如果应用程序在后台,我不希望应用程序创建系统通知。现在,当app处于前景和后台时,我能够在onMessageReceived()中获得回调。但问题是,当应用程序从内存中清除(或被杀死)时,它不会被调用。当我的应用被杀时,如何在onMessageReceived中获得回调?

的Manifest.xml

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

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

    <meta-data
        android:name="com.google.firebase.messaging.default_notification_channel_id"
        android:value="promotions" />

FcmMessagingService.java

public class FcmMessagingService extends FirebaseMessagingService {
@Override
public void onMessageReceived(RemoteMessage remoteMessage) {

    if (remoteMessage == null)
        return;

    // Check if message contains a notification payload.
    if (remoteMessage.getNotification() != null) {
        Logger.v(Logger.TAG, "Notification Body: " + remoteMessage.getNotification().getBody());
    }

    // Check if message contains a data payload.
    if (remoteMessage.getData().size() > 0) {
        Logger.v(Logger.TAG, "Data Payload: " + remoteMessage.getData().toString());

        try {
            //JSONObject json = new JSONObject(remoteMessage.getData().toString());
            NotificationHandler.handleNotification(this, formNotificationObject(null));
        } catch (Exception e) {
            Logger.e(Logger.TAG, "Exception: " + e.getMessage());
        }
    }
}

private Notification formNotificationObject(JSONObject data) {
   //creating notifcation object here
  }

的build.gradle

compile "com.google.firebase:firebase-messaging:11.4.2"
compile 'com.facebook.android:facebook-android-sdk:4.29.0'
compile "com.android.support:appcompat-v7:26.0.0"

有效载荷

{
  "to": "cogzTKfWsXI:APA9................plSjNu",
  "mutable_content": false,
  "time_to_live": 20,
  "data": {
   "messageid": 10,
   "title": "Test",
   "body": "Testing",
   "image": "",
   "expiry": "2018-11-13 11:35:11"
  }

}

2 个答案:

答案 0 :(得分:1)

如果您要在&#34; Firebase控制台 - 通知编辑器&#34;中发送消息,则它总是在前台使用。

有两种类型的消息。

  1. 通知消息
  2. 数据讯息
  3. 如果是Notification Message,它只在Foreground中处理。 但是在数据消息的情况下,它可以在后台处理。

    通过&#34; Firebase控制台 - 通知&#34;发送消息,表示消息类型为&#34;通知消息&#34;。

    如果要发送数据消息类型,则应使用Firebase云功能或其他功能。

    您可以查看以下链接: https://firebase.google.com/docs/cloud-messaging/concept-options#notifications_and_data_messages

    此链接:https://firebase.google.com/docs/cloud-messaging/android/receive#handling_messages

答案 1 :(得分:1)

Android应用程序由不同的活动和服务组成,Android区分应用程序的停止状态和活动的停止状态。当用户从最近的应用程序列表中将应用程序滑出内存时,活动将停止。另一方面,应用程序处于以下状态时处于停止状态:

  1. 首先安装但尚未启动,并且
  2. 当用户在“管理应用程序” source中手动将其停止时

问题

由于某些Android手机制造商通过在从“最近”视图中滑动应用程序时将其置于停止状态,从而误解了此规范(请参见thisthis),看来这是不可能的才能可靠地将推送通知传递到所有Android设备,除非您是WhatsApp,Gmail,Twitter等,并且已经whitelisted by these manufacturers

修复

最终结果是,有许多特定于设备和操作系统版本的因素会影响我们的应用程序推送通知的可交付性。可以尝试的事情:

  • 在Android X 7.1上,启用自动启动:设置>安全性>权限>自动启动

  • 在Android 8.0上,自动启动选项已删除,因此现在您可以转到“设置”>“电池”>“电池优化”>(左上角的三个点菜单)“高级优化”>“关闭高级优化”