Android GCM - 处理收到的消息

时间:2016-05-07 00:17:36

标签: android google-cloud-messaging

我正在尝试将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"}

对于我都收到了成功的回复。

问题:

  1. 为什么MyGcmListenerService没有收到任何消息?
  2. MyBroadcastReceiver不应添加MainActivity中的所有内容,GcmReceiver是否应该自动链接到应用?
  3. 使用MyGcmListenerService或使用自定义文件更好吗?为什么?
  4. 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

3 个答案:

答案 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相同),似乎没有延迟。

谷歌搜索有关此延迟的信息,似乎比它应该更常见:

  1. How to avoid delay in Android GCM messages
  2. Receive Android GCM messages so slow?
  3. Google Cloud Messaging - messages either received instantly or with long delay
  4. 我尝试了第一个link中提供的解决方法,但是当我在wifi上时,我会立即收到一些消息,但过了一段时间它会停止。 当我切换到4G时,我又开始接收它们了。

    我发现WhatApp通知也发生了这种情况,因为在通过wifi或4G测试此推送通知时,我发现当我切换到4G时,我从2小时前开始接收应用程序的通知。

    另外,根据link#3,应该收到最多延迟几分钟的消息,因此它也可能是设备的问题,在这种情况下是Nexus 5.

    当我发现有关此问题的更多信息时,我可能会更新此答案。

相关问题