内容简介:为了帮助开发者更高效,更容易地构建优秀的应用,在 2018 Google IO 大会上,谷歌正式推出了在最近学习官方的架构组件时,我询问了我的朋友,他指导我的学习顺序为:在对应的方法添加
为了帮助开发者更高效,更容易地构建优秀的应用,在 2018 Google IO 大会上,谷歌正式推出了 Android Jetpack Components
系列架构组件。本文的主题是 Lifecycle
,它可以有效的避免内存泄漏,和解决 Android
中生命周期常见的难题。
在最近学习官方的架构组件时,我询问了我的朋友,他指导我的学习顺序为: Lifecycle - ViewModel - LiveData
。我当时很不解,直到我将源码过了一边,才发现 Lifecycle
是 ViewModel
和 LiveData
组件的支撑。
使用
1. 首先定义一个类实现 LifecycleObserver
接口
class MainPresenter : LifecycleObserver {
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
fun onCreate() {
println("MainPresenter: ON_CREATE")
}
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
fun onDestroy() {
println("MainPresenter: ON_DESTROY")
}
}
复制代码
在对应的方法添加 @OnLifecycleEvent
注解,接下来在 LifecyleOwner
中注册观察者。
2. 在 Activity 中注册观察者
class MainActivity : AppCompatActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
println("MainActivity: onCreate")
// 注册观察者
lifecycle.addObserver(MainPresenter())
}
}
复制代码
简单的 2 步操作,我们的 MainPresenter
就可以感知当前 Activity
的生命周期。
2018-12-06 20:05:50.199 22452-22452/com.i3kmsteady.jetpacksample I/System.out: MainActivity: onCreate 2018-12-06 20:05:50.214 22452-22452/com.i3kmsteady.jetpacksample I/System.out: MainPresenter: ON_CREATE 2018-12-06 20:06:03.159 22452-22452/com.i3kmsteady.jetpacksample I/System.out: MainPresenter: ON_DESTROY 2018-12-06 20:06:03.161 22452-22452/com.i3kmsteady.jetpacksample I/System.out: MainActivity: onDestroy 复制代码
当然了,这只是一个简单的实例。在项目中的具体使用,冒昧推荐下 却把清梅嗅 的 MVVM-Rhine 。
3. 如果在项目中使用了 Java8
,推荐使用 DefaultLifecycleObserver
class MainPresenter : DefaultLifecycleObserver {
override fun onCreate(owner: LifecycleOwner) {
super.onCreate(owner)
}
}
复制代码
大概率会遇到以下错误:
Super calls to Java default methods are prohibited in JVM target 1.6. Recompile with '-jvm-target 1.8' 复制代码
在 app 下的 build.gradle
中的 android
闭包中添加以下代码即可解决:
kotlinOptions{
jvmTarget = '1.8'
}
复制代码
虽然代码实现很简单,但是我们要保持好奇心,去探究下 Lifecycle
组件的具体实现。
源码分析
从 MainActivity
中的代码展开,来探索一步一步的实现。
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 添加观察者
lifecycle.addObserver(MainPresenter())
}
复制代码
1. LifecycleOwner
LifecycleOwner是描述 Android
生命周期持有者的一个类。以 Activiy
为例来展开
@RestrictTo({Scope.LIBRARY_GROUP})
public class SupportActivity extends Activity implements LifecycleOwner, Component {
...
protected void onCreate(@Nullable Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
ReportFragment.injectIfNeededIn(this);
}
@CallSuper
protected void onSaveInstanceState(Bundle outState) {
this.mLifecycleRegistry.markState(State.CREATED);
super.onSaveInstanceState(outState);
}
@RestrictTo({Scope.LIBRARY_GROUP})
public <T extends SupportActivity.ExtraData> T getExtraData(Class<T> extraDataClass) {
return (SupportActivity.ExtraData)this.mExtraDataMap.get(extraDataClass);
}
public Lifecycle getLifecycle() {
return this.mLifecycleRegistry;
}
...
}
复制代码
lifecycle返回的是在 SupprotActivity
中初始化的 LifecycleRegistery
对象。
2. Lifecycle
Lifecycle是表示 Android
生命周期及其状态的对象,具体实现为 LifecycleRegistery
对象。让我们看下 addObserver()
@Override
public void addObserver(@NonNull LifecycleObserver observer) {
State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;
ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);
ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
if (previous != null) {
return;
}
LifecycleOwner lifecycleOwner = mLifecycleOwner.get();
if (lifecycleOwner == null) {
// it is null we should be destroyed. Fallback quickly
return;
}
boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
State targetState = calculateTargetState(observer);
mAddingObserverCounter++;
while ((statefulObserver.mState.compareTo(targetState) < 0
&& mObserverMap.contains(observer))) {
pushParentState(statefulObserver.mState);
statefulObserver.dispatchEvent(lifecycleOwner, upEvent(statefulObserver.mState));
popParentState();
// mState / subling may have been changed recalculate
targetState = calculateTargetState(observer);
}
if (!isReentrance) {
// we do sync only on the top level.
sync();
}
mAddingObserverCounter--;
}
复制代码
到这一步,似乎自定义的 LifecycleObserver
还是无法感知生命周期。回过头去看下 SupportActivity
中的 onCreate()
,发现了 ReportFragment
的身影。
3. ReportFragment
ReportFragment是一个不可见的 Fragment
,注入在 SupprotActivity
中。通过 Fragment
去感知生命周期,然后通知到 LifecycleObserver()
。这样就可以获取到当前的生命周期。以下是 ReportFragment
中生命周期的分发过程
...
@Override
public void onActivityCreated(Bundle savedInstanceState) {
super.onActivityCreated(savedInstanceState);
dispatchCreate(mProcessListener);
// 生命周期分发
dispatch(Lifecycle.Event.ON_CREATE);
}
...
复制代码
接下来看下 dispatch()
的实现
private void dispatch(Lifecycle.Event event) {
Activity activity = getActivity();
if (activity instanceof LifecycleRegistryOwner) {
((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
return;
}
if (activity instanceof LifecycleOwner) {
Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
if (lifecycle instanceof LifecycleRegistry) {
((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
}
}
}
复制代码
然后调用 Lifecycle
的 handleLifecycleEvent
去分发生命周期。
4. LifecyleRegistery
LifecyleRegistery是 Lifecycle
的实现,通过调用 handleLifecycleEvent()
去通知 LifecycleObsever
生命周期发生了变化。
public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
State next = getStateAfter(event);
moveToState(next);
}
复制代码
5. ObserverWithState
ObserverWithState是 LifecyleRegistery
的静态内部类,调用 dispatchEvent()
去通知 LifecycleObserver
。
void dispatchEvent(LifecycleOwner owner, Event event) {
State newState = getStateAfter(event);
mState = min(mState, newState);
mLifecycleObserver.onStateChanged(owner, event);
mState = newState;
}
复制代码
通过 debug 调试,发现 mLifecycleObserver
的最终实现是 ReflectiveGenericLifecycleObserver
。
6. ReflectiveGenericLifecycleObserver
ReflectiveGenericLifecycleObserver是 GenericLifecycleObserver
的实现类。 onStateChanged()
最终会调用到 CallbackInfo
的 invokeCallbacks()
。在其内部通过反射,解析 OnLifecycleEvent
注解,通知到我们所声明的 OnLifecycleEvent
注解的方法上。
结语
到此, Lifecycle 的基本流程就已经过了一边。笔者并没有对源码展开一步步的分析,而是从大体上出发,对代码的具体实现还有劳大家私下进一步的学习。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网
猜你喜欢:- 【Tomcat学习笔记】启动流程分析--总体流程
- 【Tomcat学习笔记】启动流程分析--总体流程
- 以太坊源码分析(二):以太坊启动流程分析
- RxJava2源码分析(一):基本流程分析
- MapReduce运行流程分析
- Kubelet 启动流程分析
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
Design systems
Not all design systems are equally effective. Some can generate coherent user experiences, others produce confusing patchwork designs. Some inspire teams to contribute to them, others are neglected. S......一起来看看 《Design systems》 这本书的介绍吧!