Зачем вызывать setResult в BroadcastReceiver? - PullRequest
9 голосов
/ 24 января 2012

в примере кода C2DM от Google, когда уведомление получено в BroadcastReceiver, они вызывают:

setResult(Activity.RESULT_OK, null /* data */, null /* extra */);

Я не знал, что делает setResult. вот что они говорят в Android документах:

Изменить все данные результата, возвращенные из этой трансляции; только работает с трансляциями, отправленными через Context.sendOrderedBroadcast. Все данные текущего результата заменяются значением, данным для этого метода.

Может кто-нибудь объяснить, что они имеют в виду и почему мне нужно это назвать?

Полный код:

public class C2DMBaseReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        C2DMReceiver.runIntentInService();
        setResult(Activity.RESULT_OK, null /* data */, null /* extra */);
    }
}

Ответы [ 3 ]

12 голосов
/ 12 февраля 2012

Метод setResult(...) в BroadcastReceiver, это больше, чем что-либо другое для целей отслеживания.

Если вы знакомы с методом Activity setResult(...), вы можете думать об этом методе в широковещательной рассылке таким же образом.Но вместо получения метода обратного вызова, такого как onActivityResult(int requestCode, int resultCode, Intent data), в случае действий, используется метод широковещания setResult(...), чтобы отслеживать результаты широковещания в определенном порядке, поэтому в документации говорится:

Работает только с широковещательными сообщениями, отправленными через Context.sendOrderedBroadcast.Все текущие данные результата заменяются значением, данным для этого метода.

Это означает, что вы можете использовать методы getResultCode(), getResultData() или getResultExtras(), чтобы узнать, как обстоят дела во время выполнения метода onReceive(Context, Intent) во всех различных BroadcastReceiver s зарегистрирован для обработки вашей трансляции.Таким образом, вы можете узнать результат выполнения кода в предыдущем BroadcastReceiver, вызванном перед тем, который в настоящее время выполняется для всех получателей.

В нем говорится только Context.sendOrderedBroadcast () , потому что обычныйвызов метода sendBroadcast(...) может не ждать, пока 1 получатель завершит свое выполнение, прежде чем запускать другой поток для выполнения кода в другом получателе, который также прослушивает то же самое намерение.

0 голосов
/ 13 февраля 2012

Пример. В своей основной деятельности вы запускаете операцию с кодом запроса. Ваш главный ждет результата в конце этого действия.

startActivityForResult (Intent intent, int requestCode);

В конце своей работы новое задание устанавливает код результата (работа A выполнена, работа B выполнена ... и т. Д.) И намерение (не обязательно), а также завершает себя вызовом метода finish ().

void setResult (int resultCode, Intent data);

Ваше основное действие получает этот результат с помощью функции onActivityResult (). Он проверяет код запроса, чтобы узнать, какая работа была выполнена, и получить результат / состояние этой работы. (и данные, если ожидалось намерение. но данные также могут быть кодом результата).

void onActivityResult(int requestCode, int resultCode, Intent data);

Надеюсь, я тебе помог.

0 голосов
/ 13 февраля 2012

Метод setResult () устанавливает результат, который будет использоваться в вызывающем намерении.Предположим, вы вызвали свой пользовательский получатель из любого другого действия, используя startActivityForResult (intent, code), затем в методе onActivityResult () в том же действии вы можете использовать результаты, полученные из вызванного действия, только если в методе setResult () естьдругая деятельность.Это просто способ вызвать действие через намерение и получить результаты обратно к тому же действию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...