Подтвердить что ты не робот

Почему регистрация IabBroadcastReceiver в действии плохая идея?

В образце Trivial Drive для биллинга в Google, приложение BroadcastReceiver зарегистрировано для прослушивания сообщений об обновленных покупках после успешного завершения настройки IabHelper.

Автор, однако, включил следующее примечание:

Примечание: регистрация этого слушателя в Управлении - плохая идея, но делается здесь потому что это ОБРАЗЕЦ.

Почему эта плохая идея для этого слушателя?

Этот комментарий можно найти в определении OnIabSetupFinishedListener в методе onCreate MainActivity в исходный код для примера Trivial Drive

4b9b3361

Ответ 1

Я предполагаю, что BroadcastReceiver может быть уничтожен, если он находится в Activity. BroadcastReceiver обычно объявляются в манифесте и не создаются вручную разработчиком, а операционной системой. Если он зарегистрирован в коде, единственной ссылкой, которую имеет ОС Android для BroadcastReceiver, является тот конкретный экземпляр, который привязан к жизненному циклу Activity, в котором он содержится. Если этот Activity должен был умереть/закончить/остановить для сохранения памяти, то BroadcastReceiver, объявленный внутри, скорее всего, перестанет получать обновления.

Ответ 2

Как известно, широковещательный приемник не должен ограничиваться активностью, он должен отделяться от жизненного цикла деятельности. Обычно широковещательный приемник должен определять внутри файла androidmanifest. Это позволяет активности легко прослушивать обновление, когда оно отчетливо видно пользователю, и избегать прослушивания в случае, если активность не видна пользователю с помощью un register внутри onStop/onDestroy.

Лучший способ реализовать его с использованием класса приемника Eventbus + Broadcast. Определите приемник в манифесте андроида. когда придет обновление, оно сообщит классу получателя. Мы запускаем событие, которое будет отправлено для каждого действия, которое событие регистрации получит это сообщение. Таким образом, внутри вашего приложения, где вам нужно обновление, вы можете легко подписаться и прослушать событие. Спасибо

Ответ 3

Потому что, если мы регистрируем BroadcastReceiver в Activity, то жизненный цикл привязывается к жизненному циклу Activity. Поэтому, когда активность разрушена, приемник не будет работать. Поэтому он не может получать какие-либо платы, пока активность не запущена. Может быть, вы потеряете бордюар, который покупает пользователь. В этом примере мы всегда вызываем mHelper.queryInventoryAsync(mGotInventoryListener);  в функции Activity OnCreate(). Поэтому мы не беспокоимся об этом, поскольку автор комментирует код.