您的位置:首页 > 移动开发 > Android开发

Android框架组件Lifecycle的使用详解

2018-07-31 09:13 633 查看

1.前言

Lifecycle是Google推出的一系列的框架组件的其中一个,主要是用来感知Activity和Fragment的生命周期。

本文主要介绍如何使用Lifecycle。

2.一个常见的开发例子

public class TestActivityextends 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 TestActivityextends AppCompatActivity{
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.test_activity);getLifecycle().addObserver(new TestLifeCycle());
}
}

继承

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中添加观察者

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
就稍微复杂了点,实现我们手动去完成以下步骤:

  1. 实现LifecycleOwner接口
  2. 重写getLifecycle()方法
  3. 手动标记生命周期的状态

其代码如下所示:

public class TestActivityextends Activityimplements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@NonNull
@Override
public LifecyclegetLifecycle() {
//返回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);
}
}

上面的

LifecycleRegistry
其父类是
Lifecycle

6. 其他

本文主要介绍Lifecycle的使用,相关的原理和源码分析就先不说了。后面有时间再补充~

参考资料:Handling lifecycles with lifecycle-aware components

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

您可能感兴趣的文章:

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Android Lifecycle