#android #push-notification #broadcastreceiver #google-cloud-messaging
#Android #push-уведомление #broadcastreceiver #google-облако-обмен сообщениями
Вопрос:
Я использую пример GCM от разработчиков Android и не смог понять назначение 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) доставляются одному получателю за раз. Поскольку каждый приемник выполняется по очереди, он может передавать результат следующему приемнику или он может полностью прервать трансляцию, чтобы она не передавалась другим приемникам. Порядком запуска приемников можно управлять с помощью атрибута 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);
}
}
}
Если у вас есть только один широковещательный приемник, обрабатывающий сообщение GCM, вызов setResultCode
имеет большое значение.
Комментарии:
1. Будьте осторожны с приоритетом вещания, в Android 8 вещание отправляется как обычное вещание, поэтому они будут получены для каждого получателя
Ответ №2:
На самом деле, setResultCode(Activity.RESULT_CANCEL)
сам по себе не прерывает трансляцию. Вы должны вызвать abortBroadcast()
:
http://developer.android.com/reference/android/content/BroadcastReceiver.html#abortBroadcast ()
Устанавливает флаг, указывающий, что этот приемник должен прервать текущую трансляцию; работает только с трансляциями, отправленными через Context.sendOrderedBroadcast. Это предотвратит получение трансляции любыми другими широковещательными приемниками.