GCM BroadcastReceiver使用setResultCode

jos*_*eRo 4 android broadcastreceiver push-notification google-cloud-messaging

我正在使用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); // ?????
}
}
Run Code Online (Sandbox Code Playgroud)

谢谢.

Era*_*ran 5

您的应用收到GCM消息的广播是有序广播.

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

这意味着如果您的应用程序有多个配置为处理GCM消息的广播接收器,它们将一个接一个地调用(按照依赖于其优先级的顺序).例如,如果您的应用使用某个使用GCM的第三方库,您可能有多个广播接收器处理GCM消息,此外您的应用程序直接使用GCM.在这种情况下,您希望您的应用只处理自己的消息,而不是处理发送到第三方库的消息(反之亦然).

如果其中一个处理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);
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

如果您只有一个处理GCM消息的广播接收器,则呼叫setResultCode很重要.