Android 仅当应用程序位于前台时调用GcmListenerService onMessageReceived

Android 仅当应用程序位于前台时调用GcmListenerService onMessageReceived,android,push-notification,google-cloud-messaging,gcmlistenerservice,Android,Push Notification,Google Cloud Messaging,Gcmlistenerservice,我有下列舱单- <service android:name=".RegistrationIntentService" android:exported="false" /> <service android:name=".TestGcmListenerService" android:exported="false"> <intent-filter> <action android:name="c

我有下列舱单-

<service
    android:name=".RegistrationIntentService"
    android:exported="false" />

<service
    android:name=".TestGcmListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.example.test" />
    </intent-filter>
</service>

<service
    android:name=".RegistrationIDListenerService"
    android:exported="false">
    <intent-filter>
        <action android:name="com.google.android.gms.iid.InstanceID" />
    </intent-filter>
</service>

<receiver
    android:name="com.google.android.gms.gcm.GcmReceiver"
    android:exported="true"
    android:permission="com.google.android.c2dm.permission.SEND">
    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />

        <category android:name="com.example.test" />
    </intent-filter>
</receiver>
发生的情况是,
onMessageReceived
仅在应用程序位于前台时被调用。否则它不会被调用,也不会显示通知。当我打开应用程序时,会立即显示所有通知


GcmListenereService
是否在设备锁定时唤醒设备并执行工作?如何解决这个问题?

在谷歌上搜索并设法在github上找到了这个线程,它与您关注的问题非常相似,在哪里。原因是只发送通知消息。根据螺纹中的说明:

通知消息-这些消息旨在生成通知,而无需应用程序进行中间处理只有在应用程序运行时,他们才会点击onMessageReceived。

数据消息-这些消息旨在以静默方式将数据传递给应用程序的消息服务即使应用程序在后台,他们也会点击onMessageReceived。然后,服务可以选择使用正常的系统通知API生成通知,或者选择以静默方式处理消息

我认为您正在发送通知消息,同时希望数据消息的行为生效

这里还有github线程中提到的。希望这有帮助。祝你好运

@Override
    public void onMessageReceived(String from, Bundle data) {
        ObjectMapper objectMapper = new ObjectMapper();
        Message message;
        try {
            message = objectMapper.readValue(String.valueOf(data.get("message")), Message.class);
            MessageNotification.notify(this, message, 1);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }