
1.前言Lifecycle是Google推出的一系列的框架组件的其中一个主要是用来感知Activity和Fragment的生命周期。本文主要介绍如何使用Lifecycle。2.一个常见的开发例子代码语言javascriptpublicclassTestActivityextendsActivity{OverrideprotectedvoidonCreate(Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState);xxx.onCreate();}OverrideprotectedvoidonStart(){super.onStart();xxx.onStart();}OverrideprotectedvoidonStop(){super.onStop();xxx.onStop();}}通常我们都会写出一些类似上面的代码来监听生命周期。如果有太多这样的调用将会使某个生命周期方法变的非常臃肿。如下一段例子代码语言javascriptOverrideprotectedvoidonStart(){super.onStart();xxx.onStart();xxx1.onStart();xxx2.onStart();//...}Lifecycle组件能够解决这个问题从而使代码能够写得更优雅。3.Lifecycle使用例子下面来看下如何使用Lifecycle。3.1 添加依赖在相应的moudle目录下的build.gradle中添加以下依赖代码语言javascriptdependencies{//...def lifecycle_version1.1.1implementationandroid.arch.lifecycle:runtime:$lifecycle_version}3.2 实现LifecycleObserver接口代码语言javascriptpublicclassTestLifeCycleimplementsLifecycleObserver{privatestaticfinal StringTAGtest;OnLifecycleEvent(Lifecycle.Event.ON_CREATE)publicvoidonCreate(){Log.d(TAG,onCreate: );}OnLifecycleEvent(Lifecycle.Event.ON_START)publicvoidonStart(){Log.d(TAG,onStart: );}OnLifecycleEvent(Lifecycle.Event.ON_RESUME)publicvoidonResume(){Log.d(TAG,onResume: );}OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)publicvoidonPause(){Log.d(TAG,onPause: );}OnLifecycleEvent(Lifecycle.Event.ON_STOP)publicvoidonStop(){Log.d(TAG,onStop: );}OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)publicvoidonDestroy(){Log.d(TAG,onDestroy: );}OnLifecycleEvent(Lifecycle.Event.ON_ANY)publicvoidonAny(){Log.d(TAG,onAny: );}}通过实现LifecycleObserver接口然后在相应的方法上面添加注解OnLifecycleEvent(Lifecycle.Event.XXX)即可。实际上这就是一个观察者。当执行到某个生命周期时会通知观察者执行对应的方法。3.3 Activity中添加观察者代码语言javascriptpublicclassTestActivityextendsAppCompatActivity{OverrideprotectedvoidonCreate(Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.test_activity);getLifecycle().addObserver(newTestLifeCycle());}}继承AppCompatActivity后即可通过添加观察者来监听此Activity的生命周期了。相比第2小节的例子只要一句话就完事是不是简单多了呢。到这里Lifecycle的简单使用例子就完成了。我们先来看下一个完整的生命周期的输出结果07-24 23.23:55.892 15728-15728/com.test.start D/test: onCreate: 07-24 23.23:55.892 15728-15728/com.test.start D/test: onAny: 07-24 23.23:55.893 15728-15728/com.test.start D/test: onStart: 07-24 23.23:55.893 15728-15728/com.test.start D/test: onAny: 07-24 23.23:55.895 15728-15728/com.test.start D/test: onResume: 07-24 23.23:55.895 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.183 15728-15728/com.test.start D/test: onPause: 07-24 23.23:58.184 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.576 15728-15728/com.test.start D/test: onStop: 07-24 23.23:58.577 15728-15728/com.test.start D/test: onAny: 07-24 23.23:58.585 15728-15728/com.test.start D/test: onDestroy: 07-24 23.23:58.586 15728-15728/com.test.start D/test: onAny:可以看到onAny是每个生命周期都会调用到一次。其他的话就是正常调用。注意目前只能通过继承AppCompatActivity来实现这种简单的方式直接继承Activity的话稍复杂祥见后面的分析暂且不表。3.4 Fragment中添加观察者代码语言javascriptpublicclassTestFragmentextendsFragment{OverridepublicvoidonCreate(Nullable Bundle savedInstanceState){super.onCreate(savedInstanceState);getLifecycle().addObserver(newTestLifeCycle());}}同样也可以监听到Fragment的生命周期加一个观察者即可。4. Lifecycle角色说明4.1 Lifecycle类Lifecycle类持有Activity或Fragment等组件的生命周期信息并且允许其他对象观察这些信息。Lifecycle内部使用了两个枚举来跟踪其关联组件的生命周期状态Event和State。祥见下面分析。可以通过调用Lifecycle类的addObserver()方法来添加观察者如下代码语言javascriptgetLifecycle().addObserver(newTestLifeCycle());4.2 Lifecycle事件Lifecycle组件可以感知如下事件代码语言javascriptpublicabstractclassLifecycle{publicenumEvent{ON_CREATE,ON_START,ON_RESUME,ON_PAUSE,ON_STOP,ON_DESTROY,ON_ANY}}看起来有7种实际上也就是6种而已。ON_ANY表示所有的事件都会感知。可以看到像Activity的onRestart()Fragment的onCreateView()等等其他生命周期是无法感知的。4.3 Lifecycle状态Lifecycle组件内部维护了一个State来标识Activity或Fragment当前的状态。如下代码语言javascriptpublicabstractclassLifecycle{publicenumState{DESTROYED,INITIALIZED,CREATED,STARTED,RESUMED;publicbooleanisAtLeast(NonNull State state){returncompareTo(state)0;}}}一共也就5种状态而已其状态和事件的状态关系如下图所示:4.4 LifecycleOwner接口LifecycleOwner表示它的实现类具有一个Lifecycle。它有一个getLifecycle()方法该方法必须由实现类实现。AppCompatActivity和Fragment都实现了LifecycleOwner接口Support Library 26.1.0之后的版本所以可以直接拿来使用。但是Activity类并没有实现LifecycleOwner接口所以如果我们需要去监听自定义Activity的话需要自己手动去实现LifecycleOwner接口。详见后面分析。4.5 LifecycleObserver接口观察者LifecycleObserver其实现类可以通过感知相应的生命周期来完成特定的操作。可以看前面的例子实现。5. 自定义Activity中实现LifecycleOwner感知AppCompatActivity和Fragment的子类生命周期都很简单一行代码就可以完成了。但是感知自定义Activity就稍微复杂了点实现我们手动去完成以下步骤实现LifecycleOwner接口重写getLifecycle()方法手动标记生命周期的状态其代码如下所示代码语言javascriptpublicclassTestActivityextendsActivityimplementsLifecycleOwner{privateLifecycleRegistry mLifecycleRegistry;NonNull OverridepublicLifecyclegetLifecycle(){//返回LifecyclereturnmLifecycleRegistry;}OverrideprotectedvoidonCreate(Bundle savedInstanceState){super.onCreate(savedInstanceState);setContentView(R.layout.test_activity);//创建Lifecycle对象mLifecycleRegistrynewLifecycleRegistry(this);//标记状态mLifecycleRegistry.markState(Lifecycle.State.CREATED);//添加观察者getLifecycle().addObserver(newTestLifeCycle());}OverridepublicvoidonStart(){super.onStart();//标记状态mLifecycleRegistry.markState(Lifecycle.State.STARTED);}OverrideprotectedvoidonResume(){super.onResume();//标记状态mLifecycleRegistry.markState(Lifecycle.State.RESUMED);}OverrideprotectedvoidonDestroy(){super.onDestroy();//标记状态mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);}}上面的LifecycleRegistry其父类是Lifecycle。6. 其他本文主要介绍Lifecycle的使用相关的原理和源码分析就先不说了。后面有时间再补充~更多Android进阶指南 可以扫码 解锁《Android十大板块文档》1.Android车载应用开发系统学习指南附项目实战2.Android Framework学习指南助力成为系统级开发高手3.2024最新Android中高级面试题汇总解析告别零offer4.企业级Android音视频开发学习路线项目实战附源码5.Android Jetpack从入门到精通构建高质量UI界面6.Flutter技术解析与实战跨平台首要之选7.Kotlin从入门到实战全方面提升架构基础8.高级Android插件化与组件化含实战教程和源码9.Android 性能优化实战360°全方面性能调优10.Android零基础入门到精通高手进阶之路敲代码不易关注一下吧。ღ( ´ᴗ )