Какие методы жизненного цикла Activity лучше всего использовать для регистрации/отмены регистрации в шине событий?

Как лучше всего зарегистрироваться и отменить регистрацию в шине событий (например, otto, EventBus или tinybus) в действии и почему?

  1. onCreate()-onDestroy()
  2. onStart()-onStop()
  3. при возобновлении () - при паузе ()

Пример Отто использует onResume()-onPause(), EventBus упоминает onStart()-onStop(), и нам нужно было использовать onCreate()-onDestroy() в нашем приложении, чтобы обновить пользовательский интерфейс действия, даже когда оно было в фоновом режиме. Так что я предполагаю, что это может быть любой из трех, в зависимости от характера событий и их обработки, но мне было интересно, есть ли что-то еще, что следует учитывать.


person levavare    schedule 24.03.2015    source источник
comment
Мне также нужно использовать onCreate() - onDestroy(). Нашли недостатки?   -  person aandis    schedule 04.09.2015
comment
@zack, нет, в то время я не нашел никаких недостатков, но это было всего лишь приложение PoC, так что это не было обширным опытом.   -  person levavare    schedule 21.10.2015
comment
@levavare, отметьте один из ответов ниже как принятый. Похоже, вы решили согласиться с ответом / ссылкой Джорди, но у него не так много голосов, поэтому его труднее найти.   -  person Anne Gunn    schedule 02.06.2016
comment
@agunn Я пока не вижу ответа, в котором были бы перечислены соображения, плюсы и минусы для каждого из них. onResume()-onPause() может вызвать пропущенные события с диалогами, поэтому, вероятно, лучше не использовать, но, как я вижу, выбор между onStart()-onResume() и onCreate()-onDestroy() зависит от того, хотим ли мы обрабатывать событие, пока приложение находится в фоновом режиме. (например: мы можем захотеть обновить пользовательский интерфейс (даже если он не отображается в данный момент), но не начинать новую активность)   -  person levavare    schedule 03.06.2016
comment
@levavare, я согласен с вашим наблюдением «это зависит». Пожалуйста, смотрите мой ответ + примеры случаев ниже.   -  person Anne Gunn    schedule 06.06.2016


Ответы (4)


@levavare, я думаю, что правильное время для регистрации / отмены регистрации зависит от ваших событий и того, что вы собираетесь с ними делать. И может быть разным для разных событий в рамках одного приложения.

Например, я использую EventBus в приложении для Android, которое отслеживает устройство регистрации данных в реальном времени (в данном случае Arduino) через Bluetooth. У меня есть два совершенно разных типа событий.

Первое событие отправляется моим кодом Bluetooth, чтобы уведомить один из моих фрагментов о том, что с устройства получен новый набор показаний прибора. Затем этот фрагмент записывает их в таблицу базы данных. Важно, чтобы событие всегда было услышано и на него были воздействованы. Фрагмент регистрируется/отменяет регистрацию в своих методах OnCreate/OnDestroy. Я также подписываюсь на это событие с повышенным приоритетом.

Другое событие публикуется уровнем базы данных при добавлении новой записи в базу данных. У меня есть серия фрагментов, которые показывают разные подмножества показаний (температура, давление, аварийные состояния). Когда один из этих фрагментов просматривается, он должен обновиться, как только новое чтение появится в базе данных. Но когда фрагмент находится вне поля зрения, у него нет причин воздействовать на чтение. У меня эти фрагменты регистрируются/отменяются в OnStart/OnStop. Я собирался сделать эту работу в OnResume/OnPause и, честно говоря, я думаю, что это сработает и там для моего приложения. Но ответ и ссылка @Jordy убедили меня вместо этого использовать OnStart/OnStop.

person Anne Gunn    schedule 05.06.2016

Во-первых, это не объективный вопрос, а скорее субъективный, и он приведет к множеству аргументов, основанных на аргументах.

По моему опыту, мы использовали Otto в одном из наших проектов. Мы использовали onResume()-onPause(), что очень нам помогло. Это также имеет смысл, потому что мы должны регистрироваться как можно позже и отменять регистрацию как можно быстрее при использовании шины событий.

person Amit K. Saha    schedule 24.03.2015
comment
как можно позже и отменить регистрацию как можно быстрее - спасибо, хорошая мысль, я полагаю, что это имеет смысл и с точки зрения производительности распределения событий, хотя я не уверен, насколько это действительно важно. Но я думаю, что начинать с onResume-onPause и двигаться «вверх», если это необходимо, имеет смысл. - person levavare; 25.03.2015
comment
да. Я думаю, продвижение вверх по сценарию — лучшая тактика. Не могли бы вы принять ответ, если он служит вашей цели? - person Amit K. Saha; 25.03.2015
comment
как насчет потери отправленных событий, когда приложение находилось в фоновом режиме? - person gyosida; 28.09.2015
comment
Дизайн @Gianfranco Android заключается в том, чтобы сбрасывать активность в фоновом режиме ... вы видите проблемы, когда разработчики приложений не справляются с этим в различных ситуациях, когда вы поворачиваете экран и т. Д. Ожидайте, что Activity исчезнет, ​​особенно на устройствах с 512 МБ или 1 МБ. Если вам нужно, чтобы приложение постоянно реагировало на события — создайте службу, которая работает постоянно и передает данные в Activity. Вы можете сделать еще один шаг и стать службой переднего плана с уведомлением. Вы увидите этот тип дизайна в приложениях для музыкальных проигрывателей. - person RoundSparrow hilltx; 19.01.2017

Я удалил свой комментарий в приведенном выше ответе о том, что было бы лучше зарегистрироваться/отменить регистрацию в onresume/onpause. У меня был странный вариант использования, когда некоторые мои события не доходили до аннотированного подписчика. Кажется, лучший способ - использовать onstart / onstop. Вот хороший пост SO, объясняющий, почему:

https://stackoverflow.com/a/19737191/2361947

person Jordy    schedule 21.04.2015
comment
Спасибо! Я добавил и обновил его в вопросе. Ответ пока не очевиден Думаю, если будет какой-то определенный ответ, обновлю еще раз. Мне кажется, что использование шин сообщений решает некоторые наши проблемы и может порождать некоторые другие. - person levavare; 22.04.2015
comment
Да, onStart/onStop лучше, так как он может получать сообщения, когда телефон заблокирован. ИЛИ сказать, что полученное сообщение GCM может быть передано активности через Отто - person Pranaysharma; 18.01.2016

Форма EventBus Документация, которую я нашел, и она отлично работает для меня:

@Override
 public void onStart() {
     super.onStart();
     EventBus.getDefault().register(this);
 }

 @Override
 public void onStop() {
     super.onStop();
     EventBus.getDefault().unregister(this);
 }

И если вам нужно отправить ссылку EventBus дочернему элементу, то:

private EventBus eventBus = EventBus.getDefault();
@Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        .......
}

@Override
public void onStart() {
    super.onStart();
    if(!eventBus.isRegistered(this)){
        eventBus.register(this);
    }else{
        Log.e(TAG, "EventBus is registered");
    }
}

@Override
public void onStop() {
    super.onStop();
    if(eventBus.isRegistered(this)){
       eventBus.unregister(this);
    }else{
       Log.e(TAG, "EventBus is not registered");
    }
}
person Md Imran Choudhury    schedule 11.02.2018