前言
为什么要让组件感知生命周期?
Android中大多数应用程序组件都附带有生命周期。 生命周期由操作系统或你使用的框架管理。 生命周期是Android核心而基础的东西,如果不按照生命周期写代码,可能会触发内存泄漏甚至是应用程序崩溃。
而在Api26.1.0
之前,自定义UI控件或其他的组件的生命周期都是由我们手动管理的。如果我们让这些组件和Activity/Fragment 一样具有生命周期。那么我们将不用在Activity/Fragment中同步组件的生命周期事件。
例子
举个例子。如果我们想要获取位置信息,常见的写法是这个样子的:
class MyLocationListener {
public MyLocationListener(Context context, Callback callback) {
// ...
}
void start() {
// connect to system location service
}
void stop() {
// disconnect from system location service
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, (location) -> {
// update UI
});
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start();
// 管理其他依赖生命周期的组件 ...
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// 管理其他依赖生命周期的组件 ...
}
}
这样写没毛病。但是如果有很多组件,Activity中会有大量维护生命周期的代码。使代码难以维护。
而使用Lifecycle
后,代码是这样子的:
class MyLocationListener implements LifecycleObserver {
public MyLocationListener(Context context, Lifecycle lifecycle, Callback callback) {
...
}
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void start() {
// connect to system location service
}
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void stop() {
// disconnect if connected
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
public void onCreate(...) {
myLocationListener = new MyLocationListener(this, getLifecycle(), location -> {
// update UI
});
getLifecycle().addObserver(myLocationListener)
}
}
Activity里将不再处理mLocationListener的生命周期,mLocationListener的生命周期将由Lifecycle来管理。现在我们只需要在onCreate()
时把需要感知生命周期的组件添加到Lifecycle中,Lifecycle将根据注解在Activity生命周期改变时自行回调我们对应的方法。
Lifecycle
Lifecycle
是一个持有组件生命周期状态(如Activity/Fragment)的类,并允许其他对象观察此状态。
Lifecycle
主要使用两个枚举来跟踪其关联组件的生命周期状态:
Event
Lifecycle.Event
事件 从framework
和Lifecycle
分发。这些事件和Activity/Fragment
中的生命周期对应。State
根据
Lifecycle
对象来获取当前状态
在上面的例子中,我们写的MyLocationListener
实现了LifecycleObserver
接口,并且使用了@OnLifecycleEvent
注解。在Activity
里面我们把myLocationListener
添加到了 观察者列表。
LifecycleObserver 接口
这是一个空接口,就标记一下这个类是具有生命周期意识的。
OnLifecycleEvent注解
@OnLifecycleEvent(Lifecycle.Event.ON_START)
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
注解参数为
Lifecycle.Event
枚举,这些枚举和Activity/Fragment
生命周期对应。被注解的方法将在对应生命周期被回调。Activity 添加生命周期观察
自
Api26.1.0
起,SupportActivity
默认实现 了LifecycleOwner
接口。也就是说,如果我们使用Api26.1.0
或以上的版本,我们可以直接使用getLifecycle().addObserver()
从Activity的继承关系看,我们默认使用的AppCompatActivity也是可以直接使用的。如果你的Activity直接继承自
Activity
,那么通过实现LifecycleOwner
来达到相同的效果:
“`java
public class MyActivity extends Activity implements LifecycleOwner {
private LifecycleRegistry mLifecycleRegistry;@Override protected void onCreate(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); } @NonNull @Override public Lifecycle getLifecycle() { return mLifecycleRegistry; }
}