36

我即将为我的应用程序实现 C2DM,但我发现文档对于如何编写清单有点混乱。

清单代码示例包含以下内容:

<!-- Only this application can receive the messages and registration result --> 
<permission android:name="com.example.myapp.permission.C2D_MESSAGE" android:protectionLevel="signature" />
<uses-permission android:name="com.example.myapp.permission.C2D_MESSAGE" />

这解释如下:

applicationPackage + ".permission.C2D_MESSAGE 防止其他应用程序注册和接收应用程序的消息。

但这究竟是如何工作的?据我了解,这声明了一个权限,然后为我的应用程序获取该权限。但是,该权限究竟是在哪里执行的呢?

注册时给出的代码是:

Intent registrationIntent = new Intent("com.google.android.c2dm.intent.REGISTER");
registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
registrationIntent.putExtra("sender", emailOfSender);
startService(registrationIntent);

接收到registrationIntent的Service怎么知道要检查什么权限呢?据我了解(如果我在这里错了,请纠正我),在声明权限时,我可以在我的命名空间中选择任何权限名称,例如 com.example.myapp.permission.WHATEVER。

还是 C2D_MESSAGE 是我必须使用的一些魔法常数?


此外,文档说我必须为com.google.android.c2dm.intent.C2D_MESSAGEcom.google.android.c2dm.intent.REGISTRATION意图实现接收器。但是在代码示例中,接收者的过滤器只包含.intent.RECEIVE.intent.REGISTRATIONIntents。去哪儿了C2D_MESSAGE,和我上面的问题有关系吗?

我希望这不是显而易见的事情,但我就是不明白......请帮忙。

4

1 回答 1

24

他们在摘要顶部声称您需要的接收器似乎是文档中的错误,因为它与清单示例不匹配。

“com.google.android.c2dm.intent.C2D_MESSAGE 和 com.google.android.c2dm.intent.REGISTRATION 的接收器。”)

我使用简单的示例清单条目来获得他们提供的示例,这些条目经过调整以匹配我的特定应用程序的包名称。

当 Android 中的 C2DM 代码将广播发送出去时(或者,当它寻找潜在的接收者来发送广播时),它会寻找:

查找 Intent 的广播接收器:com.google.android.c2dm.intent.REGISTRATION 具有权限的广播接收器:.permission.C2D_MESSAGE

所有由 Android C2DM 代码发送到您的应用程序的 C2DM 消息都将寻找该特定权限。它特定于您的应用程序,只需要在该结构中(您的应用程序的包+“.permission.C2D_MESSAGE”)。

关于注册请求如何获取用于权限的包名称,这是在您首次使用“app”额外注册时处理的 - 来自文档:

“app 是应用程序的 ID,设置了 PendingIntent 以允许注册服务提取应用程序信息。”

有问题的行:

registrationIntent.putExtra("app", PendingIntent.getBroadcast(this, 0, new Intent(), 0)); // boilerplate
于 2011-02-25T18:49:16.690 回答