Lifecycle 流程分析

栏目: Android · 发布时间: 7年前

内容简介:为了帮助开发者更高效,更容易地构建优秀的应用,在 2018 Google IO 大会上,谷歌正式推出了在最近学习官方的架构组件时,我询问了我的朋友,他指导我的学习顺序为:在对应的方法添加

为了帮助开发者更高效,更容易地构建优秀的应用,在 2018 Google IO 大会上,谷歌正式推出了 Android Jetpack Components 系列架构组件。本文的主题是 Lifecycle ,它可以有效的避免内存泄漏,和解决 Android 中生命周期常见的难题。

在最近学习官方的架构组件时,我询问了我的朋友,他指导我的学习顺序为: Lifecycle - ViewModel - LiveData 。我当时很不解,直到我将源码过了一边,才发现 LifecycleViewModelLiveData 组件的支撑。

使用

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);
            }
        }
    }
复制代码

然后调用 LifecyclehandleLifecycleEvent 去分发生命周期。

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() 最终会调用到 CallbackInfoinvokeCallbacks() 。在其内部通过反射,解析 OnLifecycleEvent 注解,通知到我们所声明的 OnLifecycleEvent 注解的方法上。

结语

到此, Lifecycle 的基本流程就已经过了一边。笔者并没有对源码展开一步步的分析,而是从大体上出发,对代码的具体实现还有劳大家私下进一步的学习。


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

A Byte of Python

A Byte of Python

Swaroop C H / Lulu Marketplace / 2008-10-1 / USD 27.98

'A Byte of Python' is a book on programming using the Python language. It serves as a tutorial or guide to the Python language for a beginner audience. If all you know about computers is how to save t......一起来看看 《A Byte of Python》 这本书的介绍吧!

XML、JSON 在线转换
XML、JSON 在线转换

在线XML、JSON转换工具

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试

HEX CMYK 转换工具
HEX CMYK 转换工具

HEX CMYK 互转工具