关于android:GCM如何使用BroadCastReceiver处理应用

How does GCM handle apps with BroadCastReceiver

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

1
2
3
4
5
6
7
8
9
10
    <receiver
        android:name=".GcmBroadcastReceiver"
        android:permission="com.google.android.c2dm.permission.SEND">
        <intent-filter>
           
           

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

这是一个封闭源代码的实现,因此我不确定,但是我假设您在服务器端使用的注册令牌包含Google系统建立连接所需的信息。换句话说,是将云中的GCM服务或电话中的Play服务客户端将注册令牌及其关联的发件人ID与应用的程序包名称相关联。


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

1
2
3
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%确定(因为它是封闭源),但是当您注册GCM令牌时,Google可能会传递您应用程序的软件包名称。为了让您收到推送通知,Google GCM服务器可以简单地将软件包名称与通知本身一起发送。然后,您设备上的Google Play服务应用会收到此通知,并将其路由到您设备上的正确应用。

由于InstanceID机制,这可能不是全部显式发生,但最终还是会发生。


我认为有关该主题的两个答案都可以回答您的问题。

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