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 仅在应用程序正在运行或在后台运行时触发
将 BroadcastReceiver 用于推送通知时不会被调用