Android Lifecycle框架介绍
概览
本篇主要介绍有关于Lifecycle
Lifecycle 是属于 Android Architecture Components 的一个组件, 而Android Architecture Components是属于 Android Jetpack 的一部分, 可以让组件自己管理生命周期的逻辑,避免每次调用时的繁琐步骤,用Lifecycle实现的组件可以实现生命周期的监听,数据变化的监听等功能。
关于Android Architecture Components
Android Architecture Components 主要包含以下的组件
- Room (用于数据持久化)
- Lifecycle-aware components (能感知生命周期的组件)
- ViewModels (用于存储和UI关联的数据,不会随设备旋转销毁)
- LiveData (用于监听数据变化)
- Navigation (用于应用内导航,可视化)
- Paging (用于分页加载数据)
- WorkManager (可用于创建定时启动的异步任务)
这些组件可以帮助开发者能用更少的代码更高效的开发应用。
Lifecycle集成
首先从怎么集成开始
第一步:
在build.gradle中增加google()的repo
allprojects {
repositories {
jcenter()
google()
}
第二步:
添加依赖
Java
// Lifecyle的版本,现在最新的是1.1.1
def lifecycle_version = "1.1.1"
// ViewModel 和 LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// 仅用 ViewModel
implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"
// 仅用 LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// 仅仅支持Lifecycle, 不包含LifeModel和LiveData
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
// 如果用的是java8使用以下的依赖
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// LiveData 的 ReactiveStreams插件
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// LiveData测试
testImplementation "android.arch.core:core-testing:$lifecycle_version"
Kotlin
// Lifecyle的版本,现在最新的是1.1.1
def lifecycle_version = "1.1.1"
// ViewModel 和 LiveData
implementation "android.arch.lifecycle:extensions:$lifecycle_version"
// 仅用 ViewModel
implementation "android.arch.lifecycle:viewmodel-ktx:$lifecycle_version" // use -ktx for Kotlin
// alternatively - just LiveData
implementation "android.arch.lifecycle:livedata:$lifecycle_version"
// 仅仅支持Lifecycle, 不包含LifeModel和LiveData
implementation "android.arch.lifecycle:runtime:$lifecycle_version"
kapt "android.arch.lifecycle:compiler:$lifecycle_version"
// 如果用的是java8使用以下的依赖
implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
// LiveData 的 ReactiveStreams插件
implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
// LiveData测试
testImplementation "android.arch.core:core-testing:$lifecycle_version"
为什么会引入Lifecycle
举个?
我们在应用中有使用地图跟踪用户的地理位置,地理位置的更新在一个listener里。
于是就有了如下的代码:
public void onStart() {
super.onStart();
myLocationListener.start();
public void onStop() {
super.onStop();
myLocationListener.stop();
}
这样写并不会有问题,但是会有以下两个问题可能出现:
1、如果在onStart里有一个较为耗时的block存在,在运行的过程中用户退出了程序,就会在这个block运行时提前退出Activity, 这个问题就很难被定位到。
public void onStart() {
super.onStart();
// 一个较为耗时的检查用户状态的block
Util.checkUserStatus(result -> {
// what if this callback is invoked AFTER activity is stopped?
if (result) {
myLocationListener.start();
public void onStop() {
super.onStop();
myLocationListener.stop();
}
2、如果在一个Activity内有较多的linstener需要像上面的?一样在onStart和onStop中管理,就会造成这两个地方的代码变得多而难以维护,如果忘掉一两个也很难一下子看出来。
怎么解决这个问题?
如果组件能够感知到Activity或者Fragment的变化,那么就可以在组件内部追踪Activity或者Fragment的生命周期,将之前写在Activity或者Fragment里的代码写到组件的内部。
要解决这个问题,我们首先来看看android.arch.lifecycle包中为我们提供了哪些弹药:
Lifecycle类
Lifecycle类持有组件的可监听的生命周期的状态,通过Event和State两个枚举来体现关联的生命周期的状态。
- 先来看看 Event
Event包含ON_ANY, ON_CREATE, ON_DESTROY, ON_PAUSE, ON_RESUME, ON_START, ON_STOP 这些枚举值
可以通过使用注解 OnLifecycleEvent 来定义某个方法会响应某种State状态,例如:
public class MyObserver implements LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void connectListener() {
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void disconnectListener() {
}
- 再来看看 State
State包含CREATED, DESTROYED, INITIALIZED, RESUMED, STARTED 这些枚举值, 在实现了 LifecycleOwner 接口的类中可以通过以下代码获得当前的State:
if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
}
关于LifecycleOwner接口
· Support Library 26.1.0之后的Fragments和Activity都已经继承了LifecycleOwner接口,如AppCompatActivity和Fragment都已经继承LifecycleOwner接口, 但是Activity类并没有实现这个接口,如果想要使用lifecycle的特性,可以自己手动即成LifecycleOwner接口:
import android.app.Activity;
import android.arch.lifecycle.Lifecycle;
import android.arch.lifecycle.LifecycleOwner;
import android.arch.lifecycle.LifecycleRegistry;
import android.os.Bundle;
import android.support.annotation.NonNull;
import android.support.annotation.Nullable;
public class CustomLifecycleActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;
@Override
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mLifecycleRegistry = new LifecycleRegistry(this);
mLifecycleRegistry.markState(Lifecycle.State.CREATED);
@Override
public void onStart() {
super.onStart();
mLifecycleRegistry.markState(Lifecycle.State.STARTED);