Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/maven/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 未调用GcmListenerService.onMessageReceived()_Java_Android_Google Cloud Messaging - Fatal编程技术网

Java 未调用GcmListenerService.onMessageReceived()

Java 未调用GcmListenerService.onMessageReceived(),java,android,google-cloud-messaging,Java,Android,Google Cloud Messaging,我目前正致力于在我的应用程序中实现GCM通知 我遇到的问题是没有调用我的GcmListenerService实现中的onMessageReceived()方法。我从GCM服务器很好地接收到数据,因为它会自动生成一个通知(我希望使用onMessageReceived()方法将其替换为我自己的通知),但在此之后,日志中不会打印我的日志调用 从服务器发送到GCM服务器的JSON { "notification" : { "title" : "Title", "t

我目前正致力于在我的应用程序中实现GCM通知

我遇到的问题是没有调用我的
GcmListenerService
实现中的
onMessageReceived()
方法。我从GCM服务器很好地接收到数据,因为它会自动生成一个通知(我希望使用
onMessageReceived()
方法将其替换为我自己的通知),但在此之后,日志中不会打印我的日志调用

从服务器发送到GCM服务器的JSON

{
    "notification" : {
        "title" : "Title",
        "text" : "Message",
        "icon" : "@drawable\/ic_notification",
        "click_action" : "OPEN_MAIN_ACTIVITY"
    },
    "registration_ids":[
        "xxxx", "xxxx", "xxxx", "etc"
    ]
}
AndroidManifest.xml(仅GCM部分)

不确定请求令牌的方法是否相关,但如果需要,我可以发布它


如果问题的任何部分不清楚,请告诉我,我并不擅长解释。

要在onMessageReceived中接收消息,您需要在消息对象中定义顶级“数据”字段。通知字段将自动处理并生成通知,onMessageReceived不会传递通知字段中的任何数据

更新消息对象以包含数据字段,并且应调用onMessageReceived:

{ "notification" : { "title" : "Title", "text" : "Message", "icon" : "@drawable\/ic_notification", "click_action" : "OPEN_MAIN_ACTIVITY" }, "data": { "some_key": "some_value" }, "registration_ids":[ "xxxx", "xxxx", "xxxx", "etc" ] } { “通知”:{ “头衔”:“头衔”, “文本”:“消息”, “图标”:“@drawable\/ic\u通知”, “单击操作”:“打开主活动” }, “数据”:{ “some_key”:“some_value” }, “注册ID”:[ “xxxx”、“xxxx”、“xxxx”等 ] } 正如Github问题中所解释的,这正是您的问题:

从 “GCM将代表客户端应用程序显示通知部分。当提供可选数据时,一旦用户单击通知并打开客户端应用程序,就会将其发送到客户端应用程序。 […]在Android上,数据有效负载可以按照用于启动活动的意图进行检索。

因此,在用户点击通知后,将数据传递到用于启动活动的意图中。 这意味着您需要执行以下操作:

  • 将单击操作添加到从服务器发送的通知密钥: e、 g

请参阅以下位置的通知有效负载参考:

  • AndroidManifest.xml
    中,在用户单击通知后要打开的活动上添加一个意向过滤器,其操作名称与您在服务器端的“click_action”键上使用的相同,例如:

    <activity
        android:name=".ui.MainActivity"
        android:label="@string/title_activity_main" >
        <intent-filter>
            <action android:name="OPEN_MAIN_ACTIVITY" />
            <category android:name="android.intent.category.DEFAULT" />
        </intent-filter>
    </activity>
    

我已经测试过了,可以确认它是有效的。(使用XMPP连接)

如果下游消息(json)包含通知,则不会调用GcmListenerService.onMessageReceived()

onMessageReceived
仅为“仅数据”推送消息调用

你注册了你的客户吗?我收到了一个令牌,甚至是通知(我想GCM会自动生成它们或其他东西),如果这是你的意思的话?如果你已经按照你的意思设置了你的客户,那就好了。别忘了将您的gcm令牌发送到您的服务器应用程序(我在这里看不到注册码)。我遵循了该设置是的,我将令牌发送到服务器并使用服务器发送通知,唯一的问题是在收到通知时未调用onMessageReceived()方法。它只显示一个通知本身,即使我删除了整个侦听器类。@Dan当您从服务器发送负载中的“通知”键时,不会调用onMessageReceived,您必须从Intent获取数据。只有在使用“data”键时,才会调用onMessageReceived。你可以同时使用这两种方法,但是你可以在不同的地方从每种方法中获取数据。我今晚回家后会尝试一下。有没有办法让通知字段不在Android上自动生成通知,这样我就可以使用自己的实现?最好不要删除整个通知字段,因为我在iOS中使用它。我想不出一个好的方法。您可以尝试省略图标字段,因为它在android上是必需的,但在iOS上不是。因此,我假设它在Android上会被忽略,但你仍然会在onMessageReceived中获得数据部分。删除“通知”块完全做到了这一点,并在onMessageReceived上拨打了电话。这不完全是我想要的,但我会想办法解决的。您知道是否可以将多个通知折叠为一个,这样用户就不会收到垃圾邮件通知?请参阅图像示例(sortof),如果垃圾邮件是指通知区域中有多个通知,如果通知具有相同的通知ID,则最后一个通知将替换上一个通知。若要停止后续通知,您必须检查是否已通过某个变量设置了通知。@但您不必删除通知键即可获取数据。如果您使用通知密钥,您只需在不同的位置获取其中的数据,请参见下面的答案。修复了我的问题,我在前面遇到了Github问题,但显然没有正确阅读,感谢您的澄清。有没有办法更新客户端通知?比如说,你不会收到4个相同的通知,但只有一个?诸如此类:@Dan如果您使用通知键,您可以为每个通知设置与上一个相同的“标记”键,并且具有相同标记的新通知将替换通知中心中的上一个通知。请参阅“标记”键的说明。还可以查看和delay_while_idle,这有助于告诉GCM在无法立即发送通知而您重试的情况下会发生什么。如果您不使用通知键,而是使用“数据”键,您需要通过跟踪前面显示的通知来自己进行排除。您太神奇了,如果可以的话,我会给你100票。感谢您的帮助。要详细阐述@Zephyr的观点,有:通知消息和数据消息。通知消息不存在 { "notification" : { "title" : "Title", "text" : "Message", "icon" : "@drawable\/ic_notification", "click_action" : "OPEN_MAIN_ACTIVITY" }, "data": { "some_key": "some_value" }, "registration_ids":[ "xxxx", "xxxx", "xxxx", "etc" ] }
send_queue.append({'to': REGISTRATION_ID,
               'message_id': random_id(),
               "notification" : {
                  "body" : "Hello from Server! What is going on? Seems to work!!!",
                  "title" : "Hello from Server!",
                  "icon" : "@drawable/ic_school_white_48dp",
                  "sound": "default",
                  "color": "#03A9F4",
                  "click_action": "OPEN_MAIN_ACTIVITY"
                },
               'data': { 'message': "Hello" }})
<activity
    android:name=".ui.MainActivity"
    android:label="@string/title_activity_main" >
    <intent-filter>
        <action android:name="OPEN_MAIN_ACTIVITY" />
        <category android:name="android.intent.category.DEFAULT" />
    </intent-filter>
</activity>
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    Intent intent = getIntent();

    if (intent.hasExtra(Constants.KEY_MESSAGE_TXT)) {
        String message = intent.getStringExtra(Constants.KEY_MESSAGE_TXT);
        Log.d(TAG, message);
    } 
}