Android 收到 GCM 消息并将其放入通知中

Android receiving a GCM message and put it in notification

我在这里阅读了如何接收 GCM 消息:http://developer.android.com/google/gcm/client.html - 我说的是标题:接收下游消息。有一个注意事项:使用 WakefulBroadcastReceiver 不是必需的。如果您有一个不需要服务的相对简单的应用程序,您可以在常规 BroadcastReceiver 中拦截 GCM 消息并在那里进行处理。一旦您获得 GCM 传递给您的广播接收器的 onReceive() 方法的意图,您将如何处理它取决于您。

收到 GCM 消息后,我只想从中提取标题并将其放在通知区域中,这样当用户单击它时,它将打开我的应用程序并显示特定片段。当然,该消息到达时设备可能正在休眠。

广播接收器示例是这样的:

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        // Explicitly specify that GcmIntentService will handle the intent.
        ComponentName comp = new ComponentName(context.getPackageName(),
                GcmIntentService.class.getName());
        // Start the service, keeping the device awake while it is launching.
        startWakefulService(context, (intent.setComponent(comp)));
        setResultCode(Activity.RESULT_OK);
    }
}

所以这里有几个问题:

1) 唤醒广播接收器仅仅是为了防止设备进入休眠状态还是在消息到达时唤醒它?

2) 我怎么知道我需要一个普通的广播接收器还是唤醒接收器?

3) 假设我有多个广播接收器,当消息到达时应用程序如何知道使用哪个?

4) 如果我只想提取标题并将其放在通知区域,而不是调用使用广播接收器意图的意图服务,我应该只处理广播接收器本身的意图吗?

1) Wakeful broadcast receiver is solely to prevents the device from going to sleep or also to wake it up when a message arrives?

只是为了防止设备进入睡眠状态。

2) How can I know if I need a regular broadcast receiver or a wakeful one?

如果你要做太多的工作,你需要使用 intentService 因为接收器在 UI 线程上被调用,如果你想保持你的 CPU在做你的工作时活着使用清醒。一般来说,在这种情况下 从广播接收器调用服务时 不能保证你的 CPU 不会再次入睡所以总是使用 wakeful.

3) Assuming I have several broadcast receivers, how does the app knows which to use when a message arrives?

来自清单中接收器的意图过滤器:

    <intent-filter>
        <action android:name="com.google.android.c2dm.intent.RECEIVE" />
        <category android:name="com.example" />
    </intent-filter>

4) Instead of calling an intent service that uses the intent of the broadcast receiver, if I only want to extract the title and put it in the notification area, I should just handle the intent inside the broadcast receiver itself?

是的,你可以做到,因为它不需要太多时间。并且保证CPU在执行broadCastReciever.

onRecive方法时不会休眠