GCM如何使用BroadCastReceiver处理应用程序

时间:2015-08-09 05:34:31

标签: android broadcastreceiver google-cloud-messaging intentfilter

我很难理解<intent-filter>如何处理BroadCastReceiver的基本概念。使用下面的代码我设置了一个处理任何下游消息的WakeFullBroadCastReciever。我的代码运行正常,我能够接收消息来自GCM,但从概念上讲,<receiver>如何识别要打开的应用程序。没有在流程图中Google采用我的packageName以匹配<category android:name>。我在哪里概念上出错了,gcm如何处理这适用于在设备上使用gcm服务的两个应用程序。

    <receiver
        android:name=".GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND" >
        <intent-filter>
            <action android:name="com.google.android.c2dm.intent.RECEIVE" />
            <action android:name="com.google.android.c2dm.intent.REGISTRATION" />

            <category android:name="com.gcmexample" />
        </intent-filter>
    </receiver>  

2 个答案:

答案 0 :(得分:1)

我认为this topic上的两个答案都可以回答你的问题。

简而言之:在获取API密钥时,您应该已将应用程序的软件包名称和发布签名密钥的SHA-1签名提供给Google控制台。其余的是通过Play服务完成的。

答案 1 :(得分:1)

当您的应用注册自己以获取其推送通知令牌时,您需要执行以下操作:

InstanceID instanceID = InstanceID.getInstance(this);
String token = instanceID.getToken(getString(R.string.gcm_defaultSenderId),
                    GoogleCloudMessaging.INSTANCE_ID_SCOPE, null);

请在此处查看完整示例: https://developers.google.com/instance-id/

此处使用InstanceID为您的应用程序的每个实例获取唯一标记。但它也可用于执行许多其他操作,包括验证应用程序的包名称和签名。 (有关详细信息,请查看此处:https://developers.google.com/instance-id/

因此,虽然我无法100%确定(因为它是封闭源代码),但Google可能会在您注册GCM令牌时传递应用程序的包名称。因此,您收到推送通知后,Google GCM服务器可以直接发送包名称和通知本身。然后,您设备上的Google Play服务应用会收到此通知,并将其发送到您设备上的正确应用程序。

由于InstanceID机制,这可能并非都是明确发生的,但在一天结束时,这将会发生。