我很难理解<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>
答案 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机制,这可能并非都是明确发生的,但在一天结束时,这将会发生。