Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is lifecycle observer and how to use it correctly?

I have read about new architectural components in Android. So, i wanted to ask what are lifecycle observers and why do we need them? In what cases it is useful? Thanks for your answer!

like image 724
Nazarii Moshenskiy Avatar asked Sep 17 '18 14:09

Nazarii Moshenskiy


People also ask

How do you use a life cycle owner?

LifecycleOwner is a single method interface that denotes that the class has a Lifecycle . It has one method, getLifecycle() , which must be implemented by the class. If you're trying to manage the lifecycle of a whole application process instead, see ProcessLifecycleOwner .

What is the life cycle of Android activity?

Activity-lifecycle concepts To navigate transitions between stages of the activity lifecycle, the Activity class provides a core set of six callbacks: onCreate() , onStart() , onResume() , onPause() , onStop() , and onDestroy() . The system invokes each of these callbacks as an activity enters a new state.

What does lifecycle-aware mean?

A life cycle aware component is a component which is aware of the life cycle of other components like activity or fragment and performs some action in response to change in life cycle status of this component.


2 Answers

You can use ProcessLifecycleOwner to get your Application's LifeCycle and to add a class as an observer of these events. You can implement LifecycleObserver in your Application Class:

public class MyApplication extends MultiDexApplication implements LifecycleObserver  @Override public void onCreate() {     super.onCreate();      ProcessLifecycleOwner.get().getLifecycle().addObserver(this);  } 

// Add these Lifecycle methods to observe when your app goes into the background or to the foreground:

@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(); } 

// Add the following in your build.gradle file

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

//Also In Activities or Fragments

You can also use them to reduce the complexity of code by creating different components which are implementing LifecycleObserver and then pass the lifecycle of activity to these components. This way you can split up the huge complexity to different components.

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")     } } 

This way you can listen to activity or fragment lifecycle events in separate components.

We can also manually fetch the current state of our lifecycle instance in Activity and that we can do by using its getCurrentState()

A State also has an isAtLeast() method that we can use to perform comparisons against the current lifecycle state

like image 198
Alok Gupta Avatar answered Oct 11 '22 18:10

Alok Gupta


May be a little late to the party, but another nice use-case of lifecycles (except for the obvious ViewModel stuff), is to let many components of the app un-register themselves when the relevant activity is getting destroyed, or simply out of screen.

For example, I have a static factory that creates dialogs, and using lifecycle I can dismiss the dialogs without cluttering the host activity with the old stuff like Dialog mDialog = ... and void onPause(){ ... if (mDialog !null && mDialog.isShowing()) mDialog.cancel() }

Some code:

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     } } 
like image 37
Re'em Avatar answered Oct 11 '22 18:10

Re'em