Когда регистрировать / отменять регистрацию приемников вещания, созданных в действии? - PullRequest
72 голосов
/ 25 октября 2011

Мне нужно создать настраиваемый приемник вещания в событии onCreate действия, и, очевидно, мне нужно отменить регистрацию приемника вещания в событии onDestroy действия

Для ясности это фрагмент кодакод, который я использую

public class AnActivity extends Activity {
    private ResponseReceiver receiver;

    public class ResponseReceiver extends BroadcastReceiver {
           public static final String ACTION_RESP =
              "mypackagename.intent.action.MESSAGE_PROCESSED";

           @Override
            public void onReceive(Context context, Intent intent) {
// TODO Start a dialogue if message indicates successfully posted to server
            }
    }   

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        IntentFilter filter = new IntentFilter(ResponseReceiver.ACTION_RESP);
        filter.addCategory(Intent.CATEGORY_DEFAULT);
        receiver = new ResponseReceiver();
        registerReceiver(receiver, filter);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        unregisterReceiver(receiver);
    }

Я прочитал, что события onPause / onResume и onStart / onStop для действия должны также регистрировать и отменять регистрацию приемника вещания.

Я действительно хочу понять, чтосчитается наилучшей практикой для этого и почему.

Ответы [ 5 ]

82 голосов
/ 25 октября 2011

Вы должны зарегистрировать и отменить регистрацию своих получателей onStart() и onStop().

Единственная причина, по которой активность будет регистрироваться BroadcastReceiver s, заключается в том, чтобы каким-либо образом использовать события для текущей деятельности, чтобы сообщитьПользователь события.Если был вызван onStop(), то Activity больше не находится на переднем плане, и поэтому не может обновлять пользователя.

Если вы хотите получать широковещательные события в фоновом режиме, вам следует рассмотреть возможность использования службы в качествеуказано здесь .

Как говорит Константин, onDestroy() не гарантированно вызывается, и вы можете продолжать получать трансляции в течение длительного времени, когда Activity больше не открыт.

19 голосов
/ 25 октября 2011

Поскольку onDestroy() не гарантировано для вызова, вы должны использовать onPause() для отмены регистрации.Рассмотрим жизненный цикл вашего вещательного приемника: нужен ли он, чтобы быть активным, только когда ваша деятельность находится на переднем плане?Затем используйте onResume() / onPause()

8 голосов
/ 13 июня 2017

В документации Android не прописано ни одного места для регистрации / отмены регистрации приемников вещания, но упоминает и onStart() / onStop(), и onResume() / onPause() в качестве возможностей.

Самый важный фактор при принятии этого решения - когда ваш приемник должен уметь выполнять свою работу?Это будет определять, когда регистрировать и отменять регистрацию.

  • Нужно ли приемнику что-то делать с трансляцией только тогда, когда активность находится в фокусе?Если это так, вы можете зарегистрировать / отменить регистрацию в onPause() / onReceive().(Вы также можете использовать более длительный срок службы, такой как onStart() / onStop(), но затем вы должны проверить на приемнике onReceive(), находится ли действие в фокусе.)

  • Приемник должен что-то делать, когда он виден, даже если у него нет фокуса (например, когда отображается диалог)Если это так, используйте onStart() / onStop() (или более длительный срок службы, но, опять же, onReceive() получателя должен проверить, видна ли активность).

  • Нужен ли получателюузнать о трансляции, даже если активность не видна?Например, нужно ли помнить, что что-то произошло, чтобы, когда действие стало видимым, оно могло отражать итоговое состояние дел?Затем вам нужно использовать onCreate() / onDestroy() для регистрации / отмены регистрации.(Обратите внимание, что существуют и другие способы реализации такого рода функций.)

Если вы регистрируетесь в onStart(), не регистрируйте их также в onResume(), потому что это будет избыточно: onResume() никогда не вызывается без вызова onStart() первым.

Также имейте в виду, что лучше всего поддерживать onPause () как можно более легким :

Выполнение onPause () очень короткое и не обязательно дает достаточно времени для выполнения операций сохранения.По этой причине вам не следует использовать onPause () для сохранения данных приложения или пользователя, выполнения сетевых вызовов или выполнения транзакций базы данных;такая работа может не завершиться до завершения метода.Вместо этого вы должны выполнять операции отключения при большой нагрузке во время onStop ().

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

5 голосов
/ 14 октября 2016

Android может убить ваше приложение, пропустив метод onStop().Лучший способ разрешить эту ситуацию - зарегистрировать BroadcastReceiver в методе onResume() и отменить регистрацию в onPause().

0 голосов
/ 04 апреля 2019

Вы должны зарегистрировать и отменить регистрацию вашей трансляции в методах onResume () и onPause ().

, если вы регистрируетесь в onStart () и отменяете регистрацию в onStop ().тогда вы получите следующую проблему:

, если экран вашего устройства заблокирован, то вызывается onStop (), и если вы разблокируете это время, onStart () никогда не вызывается.вот почему у вас есть регистрация и отмена регистрации в методах onResume () и onPause ().

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