【发布时间】:2016-05-07 00:17:35
【问题描述】:
我正在尝试将 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处理什么?
【问题讨论】:
标签: android google-cloud-messaging