我正在尝试将GCM添加到我的应用中。 现在我只想查看消息接收的日志。
我的AndroidManifest.xml
包含此内容:
<!-- GCM Receiver -->
<receiver
android:name="com.x.android.gcm.MyBroadcastReceiver"
android:permission="com.google.android.c2dm.permission.SEND" >
<intent-filter>
<!--<action android:name="com.google.android.c2dm.intent.REGISTRATION" />-->
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
<category android:name="com.x.android" />
</intent-filter>
</receiver>
<!-- GCM Listener -->
<service
android:name="com.x.android.gcm.MyGcmListenerService"
android:exported="false" >
<intent-filter>
<action android:name="com.google.android.c2dm.intent.RECEIVE" />
</intent-filter>
</service>
<!-- GCM InstanceID Listener -->
<service
android:name="com.x.android.gcm.MyInstanceIDListenerService"
android:exported="false">
<intent-filter>
<action android:name="com.google.android.gms.iid.InstanceID"/>
</intent-filter>
</service>
<!-- GCM Registration -->
<service
android:name="com.x.android.gcm.RegistrationIntentService"
android:exported="false">
</service>
在MainActivity
我有:
private BroadcastReceiver mReceiver;
private boolean isReceiverRegistered;
...
protected void onCreate(Bundle savedInstanceState) {
...
mReceiver= new MyBroadcastReceiver();
registerReceiver();
if (checkPlayServices()) {
Intent intent = new Intent(this, RegistrationIntentService.class);
startService(intent);
}
...
}
private void registerReceiver(){
if(!isReceiverRegistered) {
LocalBroadcastManager.getInstance(this).registerReceiver(mRegistrationBroadcastReceiver,
new IntentFilter(Preferences.REGISTRATION_COMPLETE));
isReceiverRegistered = true;
}
}
MyBroadcastReceiver
:
public class MyBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ComponentName comp = new ComponentName(
MyGcmListenerService.class.getPackage().getName(),
MyGcmListenerService.class.getName());
context.startService((intent.setComponent(comp)));
setResultCode(Activity.RESULT_CANCELED);
}
}
RegistrationIntentService
:
public class RegistrationIntentService extends IntentService {
private static final String TAG = RegistrationIntentService.class.getSimpleName();
public RegistrationIntentService() { super(TAG); }
protected void onHandleIntent(Intent intent) {
InstanceID instanceID = InstanceID.getInstance(this);
String senderId = getString(R.string.gcm_defaultSenderId);
try {
String token = instanceID.getToken(senderId, GoogleCloudMessaging.INSTANCE_ID_SCOPE);
sendRegistrationToServer(token);
subscribeTopics(token); // /topics/global
} catch(...) {...}
}
Intent registrationComplete = new Intent(Preferences.REGISTRATION_COMPLETE);
LocalBroadcastManager.getInstance(this).sendBroadcast(registrationComplete);
}
最后是MyGcmListenerService
:
public class MyGcmListenerService extends GcmListenerService {
@Override
public void onMessageReceived(String from, Bundle data) {
String message = data.getString("message");
Log.d(TAG, "From: " + from);
Log.d(TAG, "Message: " + message);
}
}
我正在尝试的请求是:
{"data": { "message": "direct message" }, "to": "TOKEN" }
{"data": { "message": "topic message" }, "to": "/topics/global"}
对于我都收到了成功的回复。
问题:
MyGcmListenerService
没有收到任何消息?MyBroadcastReceiver
不应添加MainActivity
中的所有内容,GcmReceiver
是否应该自动链接到应用?MyGcmListenerService
或使用自定义文件更好吗?为什么? MyBroadcastReceiver
不应该处理所有接收消息吗?如果没有,应该由它处理什么以及class ActiveSupport::TimeWithZone
def in_time_zone_(new_zone = ::Time.zone)
Time.zone.parse(in_time_zone(new_zone).strftime('%a, %d %b %Y %H:%M:%S'))
end
end
?答案 0 :(得分:0)
首先更新广播,看看你在Log中得到了什么
public class MyBroadcastReceiver extends WakefulBroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Bundle extras = intent.getExtras();
String string = "Bundle{";
for (String key : extras.keySet()) {
string += " " + key + " => " + extras.get(key) + ";";
}
string += " }Bundle";
Log.e("string","string"+string);
ComponentName comp = new ComponentName(
MyGcmListenerService.class.getPackage().getName(),
MyGcmListenerService.class.getName());
context.startService((intent.setComponent(comp)));
setResultCode(Activity.RESULT_CANCELED);
}
}
答案 1 :(得分:0)
检查这希望这会对您有所帮助GCM-Example
答案 2 :(得分:0)
从服务器向GCM发送邮件的时间与应用程序中收到邮件的时间之间似乎有一段延迟......
我重新启动手机,在连接到我的wifi网络之前,我收到了所有消息。 如果我使用4G(并且可能与3G相同),似乎没有延迟。
谷歌搜索有关此延迟的信息,似乎比它应该更常见:
我尝试了第一个link中提供的解决方法,但是当我在wifi上时,我会立即收到一些消息,但过了一段时间它会停止。 当我切换到4G时,我又开始接收它们了。
我发现WhatApp
通知也发生了这种情况,因为在通过wifi或4G测试此推送通知时,我发现当我切换到4G时,我从2小时前开始接收应用程序的通知。
另外,根据link#3,应该收到最多延迟几分钟的消息,因此它也可能是设备的问题,在这种情况下是Nexus 5.
当我发现有关此问题的更多信息时,我可能会更新此答案。