之前在 掘金 发布过, 重新整理在这里
之前用过一些android架构组件,但也仅限于api调用,知其然也该知其所以然,所以尝试了解下其源码实现,后续会出livedata,viewmodel的;
本文基于: macOS 10.13/AS 3.3.1/support-v7 28.0.0/lifecycle 1.1.1
demo项目
使用方法简介
以前拆分业务逻辑到独立的 presenter
中时,需要重写 Activity
/Fragment
各生命周期,然后告知 presenter
, 写起来麻烦, 有没有比较简单的方式能把这些”脏活”给处理掉呢?
我们看看 Lifecycle
架构组件的写法:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| class MainActivity : AppCompatActivity() { override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) lifecycle.addObserver(MainActObserver()) } }
class MainActObserver : LifecycleObserver { @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) fun onCreate() { Logger.d("MainActObserver $this onCreate") } @OnLifecycleEvent(Lifecycle.Event.ON_RESUME) fun onResume() { Logger.d("MainActObserver onResume") } }
|
可以看到就简单一句 lifecycle.addObserver(MainActObserver())
就完成了 Activity
各生命周期的监听;
P.S. 由于 Android Studio 创建项目时默认导入了 support 的 appcompat-v7 包,已经把 Lifecycle 相关代码导入进来了, 因此我们可以直接使用,不需要额外添加依赖;
以上明显是观察者模式:
Lifecycle
作为被观察对象,持有生命周期状态信息;
Activity/Fragment
是 Lifecycle
的宿主, 抽象为: LifecycleOwner
, 会将自身生命周期的变化告知 lifecycle
, 后者更新当前状态值(State
);
- 原
presenter
可当作观察者,记为: LifecycleObserver
;
Lifecycle 类解析
Lifecycle
类需要对各生命周期事件作出反应, 然后保存当前宿主的状态,最后通知各 Observer
:
我们看下源码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| 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();
public enum Event { ON_CREATE, ON_START, ON_RESUME, ON_PAUSE, ON_STOP, ON_DESTROY, ON_ANY }
public enum State { DESTROYED, INITIALIZED, CREATED, STARTED, RESUMED; public boolean isAtLeast(@NonNull State state) { return compareTo(state) >= 0; } } }
|
可以发现 Lifecycle
只是个抽象类,而且没有对生命周期的变化做出响应的方法, 因此应该有个实现类对生命周期事件作出处理;
我们通过 AS 提供 Type Hierarchy
功能(ctrl+h
)得知 LifecycleRegistry
类,并得到如下类图: