携手创造,一起生长!这是我参与「日新方案 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.CREATED
Lifecycle.State.DESTROYED
Lifecycle.State.RESUMED
Lifecycle.State.STARTED
Lifecycle.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:生命周期组件详解&原理剖析 – 简书