GCM BroadcastReceiver setResultCode 使用

Posted

技术标签:

【中文标题】GCM BroadcastReceiver setResultCode 使用【英文标题】:GCM BroadcastReceiver setResultCode use 【发布时间】:2014-07-06 09:27:18 【问题描述】:

我正在使用来自 android 开发人员的 GCM 示例,但无法理解 setResultCode(Activity.Result_OK)。 哪个组件接收到这个消息?谁在呼叫和接收它?

这里是例子

public class GcmBroadcastReceiver extends WakefulBroadcastReceiver 
@Override
public void onReceive(Context context, Intent intent) 
    ComponentName comp = new ComponentName(context.getPackageName(),GcmIntentService.class.getName());
    startWakefulService(context, (intent.setComponent(comp)));
    setResultCode(Activity.RESULT_OK); // ?????


谢谢。

【问题讨论】:

【参考方案1】:

您的应用接收 GCM 消息的广播是有序广播。

有序广播(使用 Context.sendOrderedBroadcast 发送)一次被传送到一个接收器。当每个接收器依次执行时,它可以将结果传播给下一个接收器,或者它可以完全中止广播,这样它就不会传递给其他接收器。运行的order receivers可以通过匹配intent-filter的android:priority属性来控制;具有相同优先级的接收器将以任意顺序运行。

这意味着,如果您的应用配置了多个广播接收器来处理 GCM 消息,则它们将被一个接一个地调用(顺序取决于它们的优先级)。例如,如果您的应用程序使用一些使用 GCM 的第三方库,并且您的应用程序直接使用 GCM,则您可能有多个广播接收器处理 GCM 消息。在这种情况下,您希望您的应用只处理自己的消息,而不是发送到 3rd 方库的消息(反之亦然)。

如果其中一个处理 GCM 消息,而您不希望其他人也处理它,您可以中止广播。你通过setResultCode(Activity.RESULT_CANCEL) 来做。另一方面,setResultCode(Activity.RESULT_OK) 会将第一个接收者的结果传播到下一个接收者。

在这种情况下,您的代码将如下所示:

public class GCMBroadcastReceiver extends WakefulBroadcastReceiver 

    @Override
    public void onReceive(Context context, Intent intent) 
        if (intent.getExtras ().get("from").equals (SENDER_ID_OF_YOUR_APP) 
          ComponentName comp = new ComponentName(
            GcmIntentService.class.getPackage().getName(),
            GcmIntentService.class.getName());
          startWakefulService(context, (intent.setComponent(comp)));
          // abort the broadcast
          setResultCode(Activity.RESULT_CANCEL);
         else
          // don't abort the broadcast
          setResultCode(Activity.RESULT_OK);
        
    

如果您只有一个广播接收器处理 GCM 消息,那么调用 setResultCode 就很重要。

【讨论】:

注意广播优先级,在 android 8 中广播是作为普通广播发送的,因此每个接收者都会收到它们【参考方案2】:

实际上,setResultCode(Activity.RESULT_CANCEL) 本身不会中止广播。你必须打电话给abortBroadcast()

http://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast()

设置标志指示此接收器应中止当前广播;仅适用于通过 Context.sendOrderedBroadcast 发送的广播。这将阻止任何其他广播接收器接收广播。

【讨论】:

以上是关于GCM BroadcastReceiver setResultCode 使用的主要内容,如果未能解决你的问题,请参考以下文章

GCM BroadcastReceiver 仅在应用程序正在运行或在后台运行时触发

GCM 推送通知实现

为啥 GCM 推送通知会重复?

将 BroadcastReceiver 用于推送通知时不会被调用

是否有任何理由继续使用 IntentService 处理 GCM 消息?

推送通知未到达