【安卓】Jetpack架构组件库-Lifecycle应用解析之知其然
原文连接:https://mp.weixin.qq.com/s/vF4v5ELjM6qYzU-MlXHhWw
前言
一、Jetpack 介绍
1、什么是Lifecycle
2、Lifecycle解决什么问题?
一种常见的模式是在 Activity 和 Fragment 的生命周期方法中实现依赖组件的操作。但是,这种模式会导致代码条理性很差而且会扩散错误。
比如,我们通过Activity在屏幕上显示当前的定位,通常会做如下实现:
class MyLocationListener {public MyLocationListener(Context context, Callback callback) {
// ...
}
void start() {
// 开启定位服务
}
void stop() {
// 断开定位服务
}
}
class MyActivity extends AppCompatActivity {
private MyLocationListener myLocationListener;
@Override
public void onCreate(...) {
myLocationListener = new MyL ocationListener(this, (location) -> {
// update UI
});
}
@Override
public void onStart() {
super.onStart();
myLocationListener.start();
//管理其他组件需要响应Activity生命周期
}
@Override
public void onStop() {
super.onStop();
myLocationListener.stop();
// 管理其他组件需要响应Activity生命周期
}
}
示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。
此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。
二、Lifecycle理解与运用
Lifecycle用法:
Lifecycle 有三种写法,接下来介绍它的写法:
使用 Lifecycle 前需要先添加依赖:
//如果想单独使用,可引入下面这个依赖api 'androidx.lifecycle:lifecycle-common:2.1.0'
以上面通过Activity在屏幕上显示当前的定位位列
1、LifecycleObserver 配合注解用法:
//1. 自定义的LifecycleObserver观察者,在对应方法上用注解声明想要观 察的宿主的生命周期事件即可class LocationObserver extends LifecycleObserver{
//宿主执行了onstart时,会分发该事件
@OnLifecycleEvent(Lifecycle.Event.ON_START)
void onStart(@NotNull LifecycleOwner owner){
//开启定位
}
//宿主执行了onstop时 会分发该事件
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
void onStop(@NotNull LifecycleOwner owner){
//停止定位
}
}
//2. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
public void onCreate(...){
LocationObserver observer =new LocationObserver()
//应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用 getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
getLifecycle().addObserver(observer);
}
}
2、通过集成FullLifecyclerObserver 拥有宿主所有生命周期事件用法:
//1.查看FullLifecycleObserver源码interface FullLifecycleObserver extends LifecycleObserver {
void onCreate(LifecycleOwner owner);
void onStart(LifecycleOwner owner);
void onResume(LifecycleOwner owner);
void onPause(LifecycleOwner owner);
void onStop(LifecycleOwner owner);
void onDestroy(LifecycleOwner owner);
}
//2.用法,复写需要监听的方法
class LocationObserver implements FullLifecycleObserver{
void onStart(LifecycleOwner owner){
//开启定位
}
void onStop(LifecycleOwner owner){
//停止定位
}
}
//3. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
public void onCreate(...){
LocationObserver observer =new LocationObserver()
//应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用 getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
getLifecycle().addObserver(observer);
}
}
3、通过LifecycleEventObserver宿主生命周期事件封装成 Lifecycle.Event的用法:
//1、LifecycleEventObserver源码public interface LifecycleEventObserver extends LifecycleObserver {
/**
* Called when a state transition event happens.
*
* @param source The source of the event
* @param event The event
*/
void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
}
//2.用法
class LocationObserver extends LifecycleEventObserver{
@Override
public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
//需要自行判断life-event是onstart, 还是onstop
if(event == Lifecycle.Event.ON_START){
//开启定位
}else if (event == Lifecycle.Event.ON_STOP) {
//停止定位
}
}
}
//3. 注册观察者,观察宿主生命周期状态变化
class MyActivity extends AppCompatActivity{
public void onCreate(...){
LocationObserver observer =new LocationObserver()
//应该在Activity的 onCreate() 方法中添加此行代码,以便通过使用 getLifecycle().addObserver() 将生命周期所有者Activity与LocationObserver关联。
getLifecycle().addObserver(observer);
}
}
三、Lifecycle如何感知生命周期的状态?
我们先复习一下Activity&Fragment的生命周期方法:
1、Activity 生命周期:
onCreate()、onStart()、onResume()、onPause()、onStop() 和 onDestroy()。当 Activity 进入新状态时,系统会调用其中每个回调。
Activity A 启动 Activity B 时的操作发生顺序:
2、Fragment生命周期
Fragment和Activity还不同,它不属于四大组件范畴,但是它必须依托于Activity,其生命周期直接受宿主 Activity 生命周期的影响,
当 Activity 暂停时,Activity 的所有Fragment也会暂停;当 Activity 被销毁时,所有Fragment也会被销毁。不过,当 Activity 正在运行(处于已恢复生命周期状态)时,您可以独立操纵每个Fragment,如添加或移除Fragment。
当其 Activity 运行时,Fragment的生命周期如下:
管理Fragment生命周期与管理 Activity 生命周期很相似。和 Activity 一样,片段也以三种状态存在:
已恢复
已暂停
已停止
如下图:Activity生命周期对应的Fragment的生命周期
Fragment所在 Activity 的生命周期会直接影响Fragment段的生命周期,其表现为,Activity 的每次生命周期回调都会引发每个Fragment的类似回调。例如,当 Activity 收到 onPause() 时,Activity 中的每个Fragment也会收到 onPause()。
Fragment还有几个额外的生命周期回调,用于处理与 Activity 的唯一交互,从而执行构建和销毁Fragment界面等操作。这些额外的回调方法是:
- [x] onAttach()
在片段已与 Activity 关联时进行调用(Activity 传递到此方法内)。
- [x] onCreateView()
调用它可创建与片段关联的视图层次结构。
- [x] onActivityCreated()
当 Activity 的 onCreate() 方法已返回时进行调用。
- [x] onDestroyView()
在移除与片段关联的视图层次结构时进行调用。
- [x] onDetach()
在取消片段与 Activity 的关联时进行调用。
3、Lifecycle如何感知生命周期的状态?
Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
事件
状态
构成 Android Activity 生命周期的状态和事件如下:
宿主生命周期与宿主状态的对应关系分别为:onCreate-Created、onStart-Started、onResume-Resumed、onpause-Started、onStop-Created、onDestroy-Destroyed
当生命周期所有者的状态发生更改时,分配的生命周期对象将更新为新状态。在任何给定时间,生命周期所有者将处于以下五种状态之一:
- Lifecycle.State.INITIALIZED
- Lifecycle.State.CREATED
- Lifecycle.State.STARTED
- Lifecycle.State.RESUMED
- Lifecycle.State.DESTROYED
当组件通过不同状态转换时,生命周期对象将在已添加到列表中的任何观察器上触发事件。以下事件可用于在生命周期观察者中实现:
- Lifecycle.Event.ON_CREATE
- Lifecycle.Event.ON_START
- Lifecycle.Event.ON_RESUME
- Lifecycle.Event.ON_PAUSE
- Lifecycle.Event.ON_STOP
- Lifecycle.Event.ON_DESTROY
- Lifecycle.Event.ON_ANY
添加 observer 时,完整的生命周期事件分发
如下图,生命周期所有者的状态更改顺序以及将在每个状态转换之间在观察者上触发的生命周期事件:
< END >
【Android进化之路】
微信扫描二维码,关注我的公众号。
以上是 【安卓】Jetpack架构组件库-Lifecycle应用解析之知其然 的全部内容, 来源链接: utcz.com/a/102469.html