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


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

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

4 67

4 ответа:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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