GcmListenerService.onMessageReceived() 未调用
GcmListenerService.onMessageReceived() not called
我目前正在努力在我的应用程序中实施 GCM 通知。
我遇到的问题是我的 GcmListenerService
实现中的 onMessageReceived()
方法没有被调用。我从 GCM 服务器收到数据很好,因为它会自动生成通知(我希望使用 onMessageReceived()
方法将其替换为我自己的通知),但之后 none 我的日志调用打印在日志。
JSON 从服务器发送到 GCM 服务器
{
"notification" : {
"title" : "Title",
"text" : "Message",
"icon" : "@drawable\/ic_notification",
"click_action" : "OPEN_MAIN_ACTIVITY"
},
"registration_ids":[
"xxxx", "xxxx", "xxxx", "etc"
]
}
AndroidManifest.xml(仅 GCM 部分)
<!-- GCM START -->
<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.my.package" />
</intent-filter>
</receiver>
<service
android:name=".Services.ListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name=".Services.IDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<!-- GCM END -->
GcmListenerService(只是快速打印以查看它是否被调用)
public class ListenerService extends GcmListenerService {
private static final String TAG = "MyGcmListenerService";
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("title");
Log.d(TAG, "From: " + from);
Log.d(TAG, "Message: " + message);
}
}
不确定请求令牌的方法是否相关,但如果需要我可以post。
如果问题的任何部分不清楚,请告诉我,我不是最擅长解释的。
要在 onMessageReceived 中接收消息,您需要在消息对象中定义顶级 "data" 字段。通知字段自动处理并生成通知,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"
]
}
如 this Github 问题中所述,这正是您的问题:
来自https://developers.google.com/cloud-messaging/server#notifications_and_data_messages
"GCM 将代表客户端应用程序显示通知部分。当提供可选数据时,一旦用户单击通知并打开客户端应用程序,它就会发送到客户端应用程序。
[...] 在 Android 上,可以在用于启动 activity."
的 Intent 中检索数据负载
因此,数据在用户点击通知 后用于启动 activity、 的 Intent 中传递。
这意味着您需要执行以下操作:
在您从服务器发送的通知密钥中添加一个click_action:
例如
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" }})
请参阅通知负载参考:https://developers.google.com/cloud-messaging/server-ref#notification-payload-support
在 AndroidManifest.xml
上添加一个意向过滤器 activity 您希望在用户点击通知后打开,使用您在 "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>
从 onCreate() 方法或 onNewIntent 上获取数据() 如果您已将要在单击通知时启动的 activity 的启动模式设置为 singleTop,例如:
@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);
}
}
我已经对此进行了测试,可以确认它是否有效。 (使用 XMPP 连接)
如果下游消息 (json) 包含通知,则不会调用 GcmListenerService.onMessageReceived()。
onMessageReceived
仅为 "data only" 推送消息调用。
我目前正在努力在我的应用程序中实施 GCM 通知。
我遇到的问题是我的 GcmListenerService
实现中的 onMessageReceived()
方法没有被调用。我从 GCM 服务器收到数据很好,因为它会自动生成通知(我希望使用 onMessageReceived()
方法将其替换为我自己的通知),但之后 none 我的日志调用打印在日志。
JSON 从服务器发送到 GCM 服务器
{
"notification" : {
"title" : "Title",
"text" : "Message",
"icon" : "@drawable\/ic_notification",
"click_action" : "OPEN_MAIN_ACTIVITY"
},
"registration_ids":[
"xxxx", "xxxx", "xxxx", "etc"
]
}
AndroidManifest.xml(仅 GCM 部分)
<!-- GCM START -->
<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.my.package" />
</intent-filter>
</receiver>
<service
android:name=".Services.ListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<service
android:name=".Services.IDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<!-- GCM END -->
GcmListenerService(只是快速打印以查看它是否被调用)
public class ListenerService extends GcmListenerService {
private static final String TAG = "MyGcmListenerService";
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("title");
Log.d(TAG, "From: " + from);
Log.d(TAG, "Message: " + message);
}
}
不确定请求令牌的方法是否相关,但如果需要我可以post。
如果问题的任何部分不清楚,请告诉我,我不是最擅长解释的。
要在 onMessageReceived 中接收消息,您需要在消息对象中定义顶级 "data" 字段。通知字段自动处理并生成通知,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" ] }
如 this Github 问题中所述,这正是您的问题:
来自https://developers.google.com/cloud-messaging/server#notifications_and_data_messages "GCM 将代表客户端应用程序显示通知部分。当提供可选数据时,一旦用户单击通知并打开客户端应用程序,它就会发送到客户端应用程序。 [...] 在 Android 上,可以在用于启动 activity."
的 Intent 中检索数据负载因此,数据在用户点击通知 后用于启动 activity、 的 Intent 中传递。 这意味着您需要执行以下操作:
在您从服务器发送的通知密钥中添加一个click_action: 例如
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" }})
请参阅通知负载参考:https://developers.google.com/cloud-messaging/server-ref#notification-payload-support
在
AndroidManifest.xml
上添加一个意向过滤器 activity 您希望在用户点击通知后打开,使用您在 "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>
从 onCreate() 方法或 onNewIntent 上获取数据() 如果您已将要在单击通知时启动的 activity 的启动模式设置为 singleTop,例如:
@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); } }
我已经对此进行了测试,可以确认它是否有效。 (使用 XMPP 连接)
如果下游消息 (json) 包含通知,则不会调用 GcmListenerService.onMessageReceived()。
onMessageReceived
仅为 "data only" 推送消息调用。