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




Вы можете использовать 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/…
Будет ли вызван метод, зарегистрированный с событием Lifecycle.Event.ON_STOP, при уничтожении приложения? В моем классе приложения с использованием lifecycleobserver обнаружение переднего плана приложения и фона приложения с помощью событий ON_START и ON_STOP. Я сомневаюсь, что событие ON_STOP не запускается, когда приложение уничтожается. Обнаружение переднего плана и фоновой логики приложения работает нормально. Нужно ли мне регистрировать событие ON_DESTROY, чтобы получать обратный вызов при уничтожении приложения?
Разве в наши дни вам не нужно звонить ProcessLifecycleOwner.get().getLifecycle().addObserver(this); в главную ветку?
LifeCycleObserver является частью выпущенных Google компонентов Android Jetpack LifeCycle Architecture и представляет собой интерфейс, который позволяет вам наблюдать за наблюдаемым компонентом с учетом LifeCycle, обычно LifeCycleOwner (Activity / Fragment), для взаимодействия с LifeCycle События и состояния, связанными с этим. составная часть; так что вы можете отслеживать события lifeCycle переднего и заднего плана.
Вот несколько полезных ссылок с типичным использованием
Может быть, немного опоздал на вечеринку, но еще один хороший вариант использования жизненных циклов (за исключением очевидного материала ViewModel) - это позволить многим компонентам приложения отменить регистрацию, когда соответствующая активность уничтожается или просто выходит из строя. экран.
Например, у меня есть статическая фабрика, которая создает диалоги, и, используя жизненный цикл, я могу отклонить диалоги не загромождая деятельность хоста со старыми вещами, такими как Dialog mDialog = ... и void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }.
Некоторый код:
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();
}
}
});
}
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 уничтожаются системой при изменении конфигурации. Почему вы должны отменять их вручную?
bcs, даже если они уничтожаются, ваша активность получает исключение, прежде чем перейти к onDestory (...), поэтому вы можете не запустить свою реализацию
Я не знаю, что означает «bcs», но у меня никогда не было исключений в моей деятельности, и я не знаю, зачем мне это делать. Пользуюсь так: stackoverflow.com/a/2115770/2523899
Вы используете их, чтобы уменьшить количество обратных вызовов и очистку компонентов из-за 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 inlifecycle-extensionsand this artifact should now be considered deprecated in its entirety. We strongly recommend depending on the specific Lifecycle artifacts you need (such aslifecycle-serviceif you’re usingLifecycleServiceandlifecycle-processif you’re usingProcessLifecycleOwner) rather thanlifecycle-extensionsas there will not be a future2.3.0release oflifecycle-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
Очень подробное объяснение здесь: developer.android.com/topic/libraries/architecture/lifecycle