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

Когда регистрировать/отменять регистрацию приемников вещания, созданных в действии?

Мне нужно создать пользовательский широковещательный приемник в событии 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 события для активности также должны регистрировать и отменить регистрацию широковещательного приемника.

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

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

Ответ 5

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

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

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