携手创造,一起生长!这是我参与「日新方案 8 月更文挑战」的第11天,点击查看活动概况
要看本系列其他文章,可访问此链接Jetpack架构学习 | Stars-One的杂货小窝
最近有时间了,预备入坑Jetpack架构,第一篇就学个简略的
LifeCycle,能够协助开发者创立可感知生命周期的组件。
介绍
为什么需求LifeCycle组件?
在许多情况下,咱们需求在Activity的相关生命周期中进行相关的初始化操作,比如上一节说到的EventBus,需求在OnCreate()和onDestroy()办法中进行绑定宽和绑,咱们能够运用此组件来简化操作(下面的比如便是运用LifeCycle去简化EventBus绑定Activity的操作)
LifeCycle的本质原理便是观察者形式,其中有类LifecycleOwner(被观察者)和接口LifecycleObserver(观察者),经过观察者形式,即可完结对页面生命周期进行监听,然后减低代码耦合度
这儿提下:
Support Library 26.1.0及其今后的版别(含androidx),Activity和Fragment现已完结了LifecycleOwner接口所以,咱们能够直接在Activity 和Fragment中运用
getLifecycle()办法来获取lifecycle目标,来增加观察者监听。
我是直接运用了androidx版别,所以根本运用是无需导入额定的依靠
因为Activity和Fragment完结了LifecycleOwner接口,所以,运用咱们只需求创立咱们的观察者目标,与Activity进行绑定即可
根本运用
下面以EventBus的初始化来讲解下运用办法
1.完结LifecycleObserver接口
前面也说到了,LifeCycle供给了一个接口类LifecycleObserver,这个接口里没有任何的办法,咱们需求要界说个类去完结它,即可让该类成为一个LifeCycle观察者类
咱们需求让一个类去完结此接口,因为EventBus需求绑定Activity目标,所以咱们需求类供给一个构造办法来接纳Activity目标
class EventBusInitiator(val context: Context) : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun register() {
EventBus.getDefault().register(context)
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun unregister() {
EventBus.getDefault().unregister(context)
}
}
那咱们完结了接口类,怎么让Lifecycle回调咱们的办法呢?这儿Lifecycle规划就和EventBus有些异曲同工之妙了,也是供给注解的方式,然后Activity在进入对应的生命周期会回调参数
OnLifecycleEvent注解里的参数只接纳对应的事情,事情有以下7种类型
-
ON_CREATE匹配Activity的onCreate事情 -
ON_START匹配Activity的onStart事情 -
ON_RESUME匹配Activity的onResume事情 -
ON_PAUSE匹配Activity的onStop事情 -
ON_STOP匹配Activity的onStop事情 -
ON_DESTROY匹配Activity的onDestroy事情 -
ON_ANY能够匹配任何的事情(每次Activity的生命周期产生改动,都会调用一次)
前6种便是和Activity中的生命周期坚持对应,最后一种有点迷,不知道详细是在哪种情况下运用的
PS:在这篇文章中说到Android 架构组件之 LifeCycle详解 – SegmentFault 思否,有两种方式用来完结LifeCycle的监听
- 完结DefultLifecyceObserver接口,然后重写里边生命周期办法;
- 直接完结LifecycleObserver接口,然后经过注解的方式来接纳生命周期的改动;
Lifecycle.java文档中是主张运用第一种方式,随着Java8成为干流,注解的方式会被弃用。
这儿我也没细找文档去研讨,也不知道是不是这回事,就我个人感觉运用注解的方式会比较舒畅,智者见智仁者见仁吧
2.Activity注册观察者目标
在上面完结LifecycleObserver接口后,咱们就有个类,当Activity生命周期产生改动的话,就会将事情分发给类中,前提是咱们得让Activity注册这个类的目标,代码如下所示
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_event_bus)
lifecycle.addObserver(EventBusInitiator(this))
}
PS:如果是Java,是经过
getLifecycle()办法获取LifeCycle目标
效果与之前的比如相同,点击按钮即可改动文字
补充-判别当前页面状况
LifeCycle中的状况有以下5种类型:
Lifecycle.State.CREATEDLifecycle.State.DESTROYEDLifecycle.State.RESUMEDLifecycle.State.STARTEDLifecycle.State.INITIALIZED
INITIALIZED状况表明的是初始化完结,但onCreate()周期未开端的状况
而之后CREATED状况,标明是onCreate()周期已结束的状况,后面的顺次类推
能够参阅下面的LifeCycle状况改动和事情的解析图:
判别的话咱们能够运用LifeCycle目标的currentState状况,如下代码:
//直接一个判别就完事了
if (lifecycle.currentState == Lifecycle.State.INITIALIZED) {
}
//状况至少要是CREATED
lifecycle.currentState.isAtLeast(Lifecycle.State.CREATED)
进阶运用
进阶运用中,需求引入依靠
implementation 'androidx.lifecycle:lifecycle-extensions:2.2.0'
LifecycleService的运用
上述的只讲了Activity和Fragment的运用办法,如果咱们想要Service中想要生命周期解耦,能够运用LifecycleService,其父类是Service,只不过里边现已完结了LifecycleOwner接口,所以用法是根本相同的
咱们运用Android Studio快速新建一个Service
然后修正代码为下述代码:
class MyService : LifecycleService() {
val TAG = "MyService"
init {
lifecycle.addObserver(MyServiceObserver())
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int {
//敞开服务就敞开个线程
Log.d(TAG, "onStartCommand: 履行")
thread {
for (i in 0..5) {
Log.d(TAG, "线程打印: $i")
Thread.sleep(1000)
}
}
return super.onStartCommand(intent, flags, startId)
}
}
class MyServiceObserver() : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun create() {
Log.d("MyService", "Service中的oncreate办法履行了");
}
}
Service的生命周期和上述Activity的比如相同,这儿不再赘述,日志打印如图所示
PS:记住在Activity中运用startService敞开服务哦
想起来,之前还没写过Service的学习笔记:joy: 之后有空补上
ProcessLifecycleOwner的运用
除了上面的情况,有时候咱们需求判别下APP是处于前台或后台,这个时候就能够运用ProcessLifecycleOwner,详细用法如下
需求咱们自界说一个application,然后在其中注册观察者即可
class MyApplication: Application() {
override fun onCreate() {
super.onCreate()
ProcessLifecycleOwner.get().lifecycle.addObserver(MyApplicationObserver())
}
}
class MyApplicationObserver : LifecycleObserver{
//在应用程序的整个生命周期中只会被调用一次
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate(){
Log.e("application","Application onCreate办法履行了");
}
//在应用程序在前台出现时被调用
@OnLifecycleEvent(Lifecycle.Event.ON_START)
fun onStart(){
Log.e("application","Application onStart办法履行了");
}
//在应用程序在前台出现时被调用
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
fun onResume(){
Log.e("application","Application onResume办法履行了");
}
//在应用程序退出到后台时被调用
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
fun onPause(){
Log.e("application","Application onPause办法履行了");
}
//在应用程序退出到后台时被调用
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
fun onStop(){
Log.e("application","Application onStop办法履行了");
}
//永久不会被调用,系统不会分发调用ON_DESTROY事情
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy(){
Log.e("application","Application onDestroy办法履行了");
}
}
PS:记住在AndroidManifest中运用咱们的这个自界说Application
日志输出如下图所示:
参阅
- Android架构之LifeCycle组件_冬瓜闯世界的博客-CSDN博客
- Android 架构组件之 LifeCycle详解 – SegmentFault 思否
- Android官方架构组件Lifecycle:生命周期组件详解&原理剖析 – 简书







