概述
Lifecycle 是用来管理感知生命周期的Jetpack基础组件,主要是为了方便需要依赖生命周期来搭建的业务逻辑。其本质原理是观察者模式,即把生命周期组件作为被观察的对象,通过注册观察者,构建状态或者事件变化通知,从而达到感知生命周期的。
为什么要使用lifecycle?
activity 和fragment 是有生命周期的,有时候,我们的很多操作需要写在声明周期的方法中,比如,下载,文件操作等,我们在activity中的生命周期方法中写越来越多的代码,便会越来越臃肿,代码维护越来越困难。 使用lifecycle就可以很好的解决这类问题。
lifecycle代码简洁,我们可以通过实现LifecycleObserver 接口,来监听声明周期,然后我们在activity和fragment中去注册监听。
Lifecycle介绍
Lifecycle组件包括LifecycleOwner、LifecycleObserver。LifeCyclerObserver是我们要实现的具有生命周期感知的类的需要实现的接口,这个接口没有任何方法。在这个类中我们通过注解来表明函数在LifeCycleOwner的哪个生命周期的时候执行。实现了LifecycleObserver 接口的类,可以在方法上添加注解来监视其组件以来的UI界面的生命周期,可以通过调用Lifecycle类的addObserver()方法传递观察者实例来添加观察者。
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
...
}
}
myLifecycleOwner.getLifecycle().addObserver(new MyObserver());
Lifecycle 主要构成
1.三个重要角色
通过Lifecycle-common的源码,归结Lifecycle的三个重要角色
- LifeCycleOwner 生命周期拥有者,即Activity与Fragment(也可自定义,但局限性大)
- LifeCycleObserver 生命周期观察者,可以是任何类,常见的有mvp的p,自定义View等
- Lifecycle 是一个抽象类,其内部不仅包括了添加和移除观察者的方法,还包括了 Event 和 State 枚举。可以看到 Event 中的事件和 Activity 的生命周期几乎是对应的,除了 ON_ANY,它可用于匹配所有事件。
public abstract class Lifecycle {
@MainThread
public abstract void addObserver(@NonNull LifecycleObserver observer);
@MainThread
public abstract void removeObserver(@NonNull LifecycleObserver observer);
@MainThread
@NonNull
public abstract State getCurrentState();
@SuppressWarnings("WeakerAccess")
public enum Event {
ON_CREATE,
ON_START,
ON_RESUME,
ON_PAUSE,
ON_STOP,
ON_DESTROY,
ON_ANY;
}
/**
* Lifecycle states. You can consider the states as the nodes in a graph and
* {@link Event}s as the edges between these nodes.
* 见下图1
*/
@SuppressWarnings("WeakerAccess")
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(state) >= 0;
}
}
}
state与event事件关系
state与event事件关系如下图,您可以将状态看作图中的节点,将事件看作这些节点之间的边。
2.LifeCycle中两个重要的接口LifeCycleOwner和LifecycleObserver 的使用
(1)LifecycleOwner(生命周期持有者接口)
官网介绍:LifecycleOwner是一个单一的方法接口,表示该类有一个 Lifecycle。它有一个方法,getLifecycle()这个方法 必须由这个类来实现。如果您试图管理整个应用程序进程的生命周期,请参阅 ProcessLifecycleOwner。该接口从各个类(如Fragment和AppCompatActivity)抽象生命周期的所有权,并允许编写与它们一起工作的组件。
任何自定义应用程序类都可以实现LifecycleOwner接口
实现LifecycleObserver的组件与实现LifecycleOwner的组件无缝协作,因为所有者可以提供生命周期,观察者可以注册以观看
简单来说,LifecycleOwner就是一个接口,谁继承了它,就持有了lifecycle对象。然后就可以调用getLifecycle()方法获取继承了抽象类Lifecycle的LifecycleRegistry,然后调用 addObserver(@NonNull LifecycleObserver observer) 方法来注册监听。
这样,该接口的生命周期(Lifecycle对象)的改变会被其注册的观察者LifecycleObserver观察到并触发其对应的事件。
注意:Support Library 26.1.0 及其以后的版本,Activity 和Fragment 已经实现了LifecycleOwner 接口,所以,我们可以直接在Activity 和Fragment中使用getLifecycle()方法来获取lifecycle对象,来添加观察者监听。
(2)LifecycleObserver(生命周期观察者接口)
LifecycleObserver 是一个观察者接口,实现了它,可以通过注解或者继承的方式,来管理声明周期的监听。只要在持有lifecycle的类中注册了它,当声明周期发生变化时,它就能收到,进行我们自定义的操作。
两种实现方式:
- 实现DefultLifecyceObserver接口,然后重写里面生命周期方法;
- 直接实现LifecycleObserver接口,然后通过注解的方式来接收生命周期的变化;
Lifecycle.java文档中是建议使用第一种方式,因为文档中说明了,随着Java8成为主流,注解的方式会被弃用。DefaultLifecycleObserver是需要另外声明的java8 比如下面
GenericLifecycleObserver,FullLifecycleObserver,DefaultLifecycleObserver 这三个接口都是直接或者间接继承的LifecycleObserver
// 如果使用的是java 8要显示声明如下的
def lifecycle_version = "1.1.1"
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
一个常见的开发例子
public class TestActivity extends Activity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
xxx.onCreate();
}
@Override
protected void onStart() {
super.onStart();
xxx.onStart();
}
@Override
protected void onStop() {
super.onStop();
xxx.onStop();
}
}
通常,我们都会写出一些类似上面的代码来监听生命周期。如果有太多这样的调用将会使某个生命周期方法变的非常臃肿。如下一段例子:
@Override
protected void onStart() {
super.onStart();
xxx.onStart();
xxx1.onStart();
xxx2.onStart();
//...
}
复制
Lifecycle组件能够解决这个问题,从而使代码能够写得更优雅。
3.Lifecycle使用例子
下面来看下如何使用Lifecycle。
3.1 添加依赖
在相应的moudle目录下的build.gradle中添加以下依赖:
dependencies {
//...
def lifecycle_version = "1.1.1"
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
}
3.2 实现LifecycleObserver接口
public class TestLifeCycle implements LifecycleObserver {
private static final String TAG = "test";
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.d(TAG, "onCreate: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.d(TAG, "onStart: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.d(TAG, "onResume: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.d(TAG, "onPause: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.d(TAG, "onStop: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.d(TAG, "onDestroy: ");
}
@OnLifecycleEvent(Lifecycle.Event.ON_ANY)
public void onAny() {
Log.d(TAG, "onAny: ");
}
}
通过实现LifecycleObserver接口,然后在相应的方法上面添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。实际上,这就是一个观察者。当执行到某个生命周期时,会通知观察者执行对应的方法。
3.3 Activity中添加观察者
public class TestActivity extends AppCompatActivity {
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity);
getLifecycle().addObserver(new TestLifeCycle());
}
}
继承AppCompatActivity后,即可通过添加观察者来监听此Activity的生命周期了。相比第2小节的例子,只要一句话就完事,是不是简单多了呢。到这里,Lifecycle的简单使用例子就完成了。
注意,目前只能通过继承AppCompatActivity来实现这种简单的方式,直接继承Activity的话稍复杂,详见后面的分析。
3.4 Fragment中添加观察者
public class TestFragment extends Fragment {
@Override
public void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getLifecycle().addObserver(new TestLifeCycle());
}
}
同样,也可以监听到Fragment的生命周期,加一个观察者即可。
4. Lifecycle角色说明
4.1 Lifecycle类
Lifecycle类持有Activity 或 Fragment等组件的生命周期信息,并且允许其他对象观察这些信息。
Lifecycle内部使用了两个枚举来跟踪其关联组件的生命周期状态:Event和State。祥见下面分析。
可以通过调用Lifecycle类的 addObserver() 方法来添加观察者,如下:
getLifecycle().addObserver(new TestLifeCycle());
复制
4.2 Lifecycle事件
Lifecycle组件可以感知如下事件:
public abstract class Lifecycle {
public enum Event {
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当前的状态。如下:
public abstract class Lifecycle {
public enum State {
DESTROYED,
INITIALIZED,
CREATED,
STARTED,
RESUMED;
public boolean isAtLeast(@NonNull State state) {
return compareTo(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()方法
- 手动标记生命周期的状态
其代码如下所示:
public class TestActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@NonNull
@Override
public Lifecycle getLifecycle() {
//返回Lifecycle
return mLifecycleRegistry;
}
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity);
//创建Lifecycle对象
mLifecycleRegistry = new LifecycleRegistry(this);
//标记状态
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
//添加观察者
getLifecycle().addObserver(new TestLifeCycle());
}
@Override
public void onStart() {
super.onStart();
//标记状态
mLifecycleRegistry.markState(Lifecycle.State.STARTED);
}
@Override
protected void onResume() {
super.onResume();
//标记状态
mLifecycleRegistry.markState(Lifecycle.State.RESUMED);
}
@Override
protected void onDestroy() {
super.onDestroy();
//标记状态
mLifecycleRegistry.markState(Lifecycle.State.DESTROYED);
}
}