Что такое наблюдатель жизненного цикла и как его правильно использовать?

Я читал о новых архитектурных компонентах в Android. Итак, я хотел спросить, что такое наблюдатели жизненного цикла и зачем они нам нужны? В каких случаях это полезно? Спасибо за Ваш ответ!

Очень подробное объяснение здесь: developer.android.com/topic/libraries/architecture/lifecycle

denvercoder9 17.09.2018 16:05

@ rafid059 спасибо!

Nazarii Moshenskiy 17.09.2018 17:01
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
27
2
22 874
5
Перейти к ответу Данный вопрос помечен как решенный

Ответы 5

Ответ принят как подходящий

Вы можете использовать ProcessLifecycleOwner, чтобы получить LifeCycle вашего приложения и добавить класс в качестве наблюдателя за этими событиями. Вы можете реализовать LifecycleObserver в своем классе приложения:

public class MyApplication extends MultiDexApplication implements LifecycleObserver

@Override
public void onCreate() {
    super.onCreate();

    ProcessLifecycleOwner.get().getLifecycle().addObserver(this);

}

// Добавьте эти методы жизненного цикла, чтобы наблюдать, когда ваше приложение переходит в фоновый или на передний план:

@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void appInResumeState() {
    Toast.makeText(this,"In Foreground",Toast.LENGTH_LONG).show();
}

@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void appInPauseState() {
    Toast.makeText(this,"In Background",Toast.LENGTH_LONG).show();
}

// Добавьте следующее в ваш файл build.gradle

implementation 'android.arch.lifecycle:extensions:1.1.1'

// Также в действиях или фрагментах

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

class MainActivity : AppCompatActivity(), LifecycleObserver {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        ReduceComplexComponent().registerLifecycle(lifecycle)

    }

}

class ReduceComplexComponent : LifecycleObserver{

    registerLifecycle(lifecycle : Lifecycle){
       lifecycle.addObserver(this)
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun resume() {
       Log.d("OnResume","ON_RESUME")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    fun pause() {
       Log.d("onPause","ON_PAUSE")
    }
}

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

Мы также можем вручную получить текущее состояние нашего экземпляра жизненного цикла в Activity, и это мы можем сделать, используя его getCurrentState ()

Состояние также имеет метод isAtLeast (), который мы можем использовать для выполнения сравнений с текущим состоянием жизненного цикла.

Если кто-то ищет решение Kotlin для наблюдения за событиями жизненного цикла приложения, может проверить эту ссылку. handyopinion.com/…

Asad Ali Choudhry 24.11.2019 09:12

Будет ли вызван метод, зарегистрированный с событием Lifecycle.Event.ON_STOP, при уничтожении приложения? В моем классе приложения с использованием lifecycleobserver обнаружение переднего плана приложения и фона приложения с помощью событий ON_START и ON_STOP. Я сомневаюсь, что событие ON_STOP не запускается, когда приложение уничтожается. Обнаружение переднего плана и фоновой логики приложения работает нормально. Нужно ли мне регистрировать событие ON_DESTROY, чтобы получать обратный вызов при уничтожении приложения?

K Pradeep Kumar Reddy 24.10.2020 09:12

Разве в наши дни вам не нужно звонить ProcessLifecycleOwner.get().getLifecycle().addObserver(this)‌​; в главную ветку?

portfoliobuilder 26.05.2021 05:56

LifeCycleObserver является частью выпущенных Google компонентов Android Jetpack LifeCycle Architecture и представляет собой интерфейс, который позволяет вам наблюдать за наблюдаемым компонентом с учетом LifeCycle, обычно LifeCycleOwner (Activity / Fragment), для взаимодействия с LifeCycle События и состояния, связанными с этим. составная часть; так что вы можете отслеживать события lifeCycle переднего и заднего плана.

Вот несколько полезных ссылок с типичным использованием

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

Например, у меня есть статическая фабрика, которая создает диалоги, и, используя жизненный цикл, я могу отклонить диалоги не загромождая деятельность хоста со старыми вещами, такими как Dialog mDialog = ... и void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }.

Некоторый код:

DialogUtils.java:

public static void showConfirmDialog(Lifecycle lifecycle, String title, String msg, Runnable okRunnable) {
    AlertDialog dialog = AlertDialog.Builder(mAppContext)
    /* configuration stuff ... */
        .build();

    dialog.show();

    lifecycle.addObserver(new LifecycleObserver() {
          @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
          public void cancelDialog() {
            if (dialog.isShowing()) { // if not already dismissed by main-button tap 
              dialog.cancel();
            }
          }
    });
}

MyActivity.java:

public class MyActivity extends AppCompatActivity {

    /* stuff... onCreate()... other stuff... */

    private void confirmDeleteUser(User user){
        DialogUtils.showConfirmDialog(
            MyActivity.this.getLifecycle(), // all activities & fragment have lifecycles
            "Confirm Delete",
            "Action cannot be undone. Sure to continue?",
            new Runnable() { /* stuff... */ }
        );
        // Voilà! 
        // activity no needs to store reference to the dialog and cancel manually on pause
        // it's a fire-and-forget action
    }
}

Я не понимаю твоего ответа. AlertDialogs уничтожаются системой при изменении конфигурации. Почему вы должны отменять их вручную?

The incredible Jan 22.01.2020 15:29

bcs, даже если они уничтожаются, ваша активность получает исключение, прежде чем перейти к onDestory (...), поэтому вы можете не запустить свою реализацию

Re'em 22.01.2020 17:50

Я не знаю, что означает «bcs», но у меня никогда не было исключений в моей деятельности, и я не знаю, зачем мне это делать. Пользуюсь так: stackoverflow.com/a/2115770/2523899

The incredible Jan 23.01.2020 09:59

Вы используете их, чтобы уменьшить количество обратных вызовов и очистку компонентов из-за Lifecycle events вашего приложения. Например, у вас есть Handler/Runnable, который где-то запускается с Thread, и вам нужно иметь некоторые обратные вызовы / интерфейсы, чтобы останавливать и удалять listener при вызове onStop(); таким образом, используя новые «компоненты Jetpack LifeCycle Architecture», вы можете сделать свой компонент / класс «осведомленным о жизненном цикле», следовательно, легко управлять им из Activity / Fragment, используя его!

Дополнительная информация, как указано выше: https://developer.android.com/topic/libraries/architecture/lifecycle

lifecycle-extensions API устарел.

lifecycle-extensions Artifact Deprecation: With the above deprecation of ViewModelProviders.of(), this release marks the deprecation of the last API in lifecycle-extensions and this artifact should now be considered deprecated in its entirety. We strongly recommend depending on the specific Lifecycle artifacts you need (such as lifecycle-service if you’re using LifecycleService and lifecycle-process if you’re using ProcessLifecycleOwner) rather than lifecycle-extensions as there will not be a future 2.3.0 release of lifecycle-extensions.

Если вы хотите продолжать использовать ProcessLifecycleOwner, рекомендуется добавить эту зависимость:

implementation "androidx.lifecycle:lifecycle-process:2.2.0"

Ссылка:
https://developer.android.com/jetpack/androidx/releases/lifecycle#version_220_3

https://androidx.tech/artifacts/lifecycle/lifecycle-extensions/

https://developer.android.com/reference/androidx/lifecycle/ProcessLifecycleOwner

Другие вопросы по теме