返回顶部
首页 > 资讯 > 精选 >Android中Lifecycle的原理是什么
  • 556
分享到

Android中Lifecycle的原理是什么

2023-06-29 00:06:11 556人浏览 薄情痞子
摘要

本文小编为大家详细介绍“Android中Lifecycle的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android中Lifecycle的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。&

本文小编为大家详细介绍“Android中Lifecycle的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android中Lifecycle的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。

        Lifecycle是Android Architecture Components的成员,是一个生命周期感知组件,能够感知Activity、Fragment等组件的生命周期变化,并将变化通知到已注册的观察者。正确的使用有助于更好地组织代码,减少内存泄漏,增强稳定。下面分析他的实现原理,看看到底只怎么感知生命周期的。

一、基本使用

1、引入依赖库

dependencies {    def lifecycle_version = "2.5.0-alpha01"    def arch_version = "2.1.0"     implementation "androidx.lifecycle:lifecycle-viewmodel:$lifecycle_version"      implementation "androidx.lifecycle:lifecycle-livedata:$lifecycle_version"     implementation "androidx.lifecycle:lifecycle-runtime:$lifecycle_version"     //非java8使用    annotationProcessor "androidx.lifecycle:lifecycle-compiler:$lifecycle_version"     //java8使用    implementation "androidx.lifecycle:lifecycle-common-java8:$lifecycle_version"  }

2、自定义一个类实现LifecycleObserver,在类中监听生命周期回调

public class Basejsapi implements LifecycleObserver {       @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)    void create() {        onCreate();    }     @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)    void destroy() {        onDestroy();    }      @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)    void resume() {        onResume();    }     @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)    void pause() {        onPause();    }     ……………………………………   }

3、在Activity或者fragment中注册。

 getLifecycle().addObserver(getJsBridge());

通过以上两步就可以感知当前Activity的生命周期了,非常的简便实用。

二、LifecycleObserver接口和LifecycleOwner接口

public interface LifecycleObserver { } public interface LifecycleOwner {  @NonNull  Lifecycle getLifecycle();}

        LifecycleObserver是一个空接口,LifecycleOwner提供getLifecycle返回Lifecycle,该接口由ComponentActivity实现,提供了getLifecycle的实现。

三、getLifecycle()

        getLifecycle方法实际上是调用的ComponentActivity的getLifecycle方法,通过查看,Activity确实也是继承的ComponentActivity,该方法返回mLifecycleReGIStry对象,该对象继承自Lifecycle,具体实现了添加观察者,移出观察者的方法,还定义了一个生命周期的枚举。

public class LifecycleRegistry extends Lifecycle {   } 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;        …………………………………………      }      ………………………………}

        也就可以看出getLifecycle().addObserver实际上就是执行LifecycleRegistry的addObserver的方法添加观察者,做一个小总结如下:

观察者实现LifecycleObserver,实现需要的生命周期。在Activity、Fragment中添通过getLifecycle().addObserver加观察者。实际上调用的是ComponentActivity的getLifecycle方法返回mLifecycleRegistry。调用LifecycleRegistry的addObserver加观察者。三、添加观察者的流程

        详情看注释:

@Overridepublic void addObserver(@NonNull LifecycleObserver observer) {    //检查是否在主线程    enforceMainThreadIfNeeded("addObserver");    //设置状态值    State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;    //将观察者和初始化的值封装到ObserverWithState中    ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);    //以观察者为key,statefulObserver为value放到HashMap集合中    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);    //不为null表示之前已经放进去了,否则没放进去,放进去了就添加结束    if (previous != null) {        return;    }    //获取被观察者对象,即Activity,如果被销毁了,则结束    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();    if (lifecycleOwner == null) {        // it is null we should be destroyed. Fallback quickly        return;    }     //mAddinGobserverCounter 表示正在添加的观察者的数量,    //开始添加新的observe之前,对该变量进行++操作,添加完成后,进行--操作。    //mHandlingEvent表示是否正在处理    boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;    //计算状态,进行while循环    State targetState = calculateTargetState(observer);    mAddingObserverCounter++;    //新添加的LifecycleObserver ,会不断更新自己的生命周期到指定的targetState    while ((statefulObserver.mState.compareTo(targetState) < 0            && mObserverMap.contains(observer))) {        //添加状态到list,计算当前状态,用于计算状态calculateTargetState        pushParentState(statefulObserver.mState);        //        final Event event = Event.upFrom(statefulObserver.mState);        if (event == null) {            throw new IllegalStateException("no event up from " + statefulObserver.mState);        }        //生命周期分发:分发到mLifecycleObserver里面        statefulObserver.dispatchEvent(lifecycleOwner, event);        //移除状态到list        popParentState();        // mState / subling may have been changed recalculate        //重新计算状态        targetState = calculateTargetState(observer);    }    //没有事件正在处理,或者是添加了observe,就需要重新同步一次状态,下面详细介绍    if (!isReentrance) {        // we do sync only on the top level.        sync();    }    mAddingObserverCounter--;}
//计算状态规则private State calculateTargetState(LifecycleObserver observer) {    //在map中获取到当前observer的前一个observer    Map.Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);    //前一个observer的state    State siblingState = previous != null ? previous.getValue().mState : null;    //如果是嵌套添加observer,获取父级observer的状态    State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)            : null;    //获取最小状态,DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED    return min(min(mState, siblingState), parentState);}

四、绑定生命周期

        上面介绍了addObserver的流程,在ComponentActivity的onCreate方法中:

ReportFragment.injectIfNeededIn(this);

        ReportFragment是一个Fragment,它负责分派生命周期的事件,injectIfNeededIn()就是在当前的Activity里添加一个ReportFragment,和glide的绑定生命周期比较类似。

public static void injectIfNeededIn(Activity activity) {    //当API>=29注册registerIn绑定生命周期    if (Build.VERSION.SDK_INT >= 29) {        // On API 29+, we can register for the correct Lifecycle callbacks directly        LifecycleCallbacks.registerIn(activity);    }    android.app.FragmentManager manager = activity.getFragmentManager();    if (manager.findFragmentByTag(REPORT_FRAGMENT_TAG) == null) {        manager.beginTransaction().add(new ReportFragment(), REPORT_FRAGMENT_TAG).commit();        // Hopefully, we are the first to make a transaction.        manager.executePendingTransactions();    }}

         当API>=29是通过Application.ActivityLifecycleCallbacks的方式注册生命周期, 以onStart为例,其他onResume、onPause等类似:

@Overridepublic void onStart() {    super.onStart();    dispatchStart(mProcessListener);    dispatch(Lifecycle.Event.ON_START);}

         重点看看dispatch:

private void dispatch(@NonNull Lifecycle.Event event) {    //当API<29分发dispatch绑定生命周期    if (Build.VERSION.SDK_INT < 29) {        // Only dispatch events from ReportFragment on API levels prior        // to API 29. On API 29+, this is handled by the ActivityLifecycleCallbacks        // added in ReportFragment.injectIfNeededIn        dispatch(getActivity(), event);    }}

        不管是pplication.ActivityLifecycleCallbacks还是当前fragment的生命周期方式都会执行如下dispatch:

static void dispatch(@NonNull Activity activity, @NonNull Lifecycle.Event event) {    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);        }    }}

        调用LifecycleRegistry的handleLifecycleEvent将生命周期分发出去,LifecycleRegistry上面已经介绍过了addObserve逻辑了,代码比较长,只显示关键代码:

handleLifecycleEvent -> moveToState -> sync

private void sync() {    LifecycleOwner lifecycleOwner = mLifecycleOwner.get();    if (lifecycleOwner == null) {        throw new IllegalStateException("LifecycleOwner of this LifecycleRegistry is already"                + "garbage collected. It is too late to change lifecycle state.");    }    //没有同步过,则同步    while (!isSynced()) {        mNewEventOccurred = false;        // no need to check eldest for nullability, because isSynced does it for us.        if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {            //如果ObserverWithState的state小于当前state,那么就调用forwardPass方法,            backwardPass(lifecycleOwner);        }        Map.Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();        if (!mNewEventOccurred && newest != null                && mState.compareTo(newest.getValue().mState) > 0) {            //如果大于当前state,那么就调用backwardPass方法。            forwardPass(lifecycleOwner);        }    }    mNewEventOccurred = false;}

        backwardPass和forwardPass的代码都会调用:

observer.dispatchEvent(lifecycleOwner, event)

static class ObserverWithState {    State mState;    LifecycleEventObserver mLifecycleObserver;     ObserverWithState(LifecycleObserver observer, State initialState) {        mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);        mState = initialState;    }     void dispatchEvent(LifecycleOwner owner, Event event) {        State newState = event.getTargetState();        mState = min(mState, newState);        mLifecycleObserver.onStateChanged(owner, event);        mState = newState;    }}

        调用了Lifecycling.getCallback方法来获得mLifecycleObserver的实例,通过这个实例调用onStateChanged:

static LifecycleEventObserver lifecycleEventObserver(Object object) {    boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;    boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;    if (isLifecycleEventObserver && isFullLifecycleObserver) {        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object,                (LifecycleEventObserver) object);    }    if (isFullLifecycleObserver) {        return new FullLifecycleObserverAdapter((FullLifecycleObserver) object, null);    }     if (isLifecycleEventObserver) {        return (LifecycleEventObserver) object;    }    //通过反射,找到Lifecycle 自动生成的类    final Class<?> klass = object.getClass();    int type = getObserverConstructorType(klass);    if (type == GENERATED_CALLBACK) {        List<Constructor<? extends GeneratedAdapter>> constructors =                sClassToAdapters.get(klass);        if (constructors.size() == 1) {            GeneratedAdapter generatedAdapter = createGeneratedAdapter(                    constructors.get(0), object);            最终使用生成的Adapter,创建SingleGeneratedAdapterObserver            return new SingleGeneratedAdapterObserver(generatedAdapter);        }        GeneratedAdapter[] adapters = new GeneratedAdapter[constructors.size()];        for (int i = 0; i < constructors.size(); i++) {            adapters[i] = createGeneratedAdapter(constructors.get(i), object);        }        return new CompositeGeneratedAdaptersObserver(adapters);    }    return new ReflectiveGenericLifecycleObserver(object);}
class SingleGeneratedAdapterObserver implements LifecycleEventObserver {     private final GeneratedAdapter mGeneratedAdapter;     SingleGeneratedAdapterObserver(GeneratedAdapter generatedAdapter) {        mGeneratedAdapter = generatedAdapter;    }     @Override    public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {        mGeneratedAdapter.callMethods(source, event, false, null);        mGeneratedAdapter.callMethods(source, event, true, null);    }}

        到这里会根据依赖中添加的annotationProcessor "androidx.lifecycle:lifecycle-compiler:2.2.0"根据不同生命周期注解生成不同的类,整个过程还是比较复杂的。整体过程如下图:

Android中Lifecycle的原理是什么

读到这里,这篇“Android中Lifecycle的原理是什么”文章已经介绍完毕,想要掌握这篇文章的知识点还需要大家自己动手实践使用过才能领会,如果想了解更多相关内容的文章,欢迎关注编程网精选频道。

--结束END--

本文标题: Android中Lifecycle的原理是什么

本文链接: https://lsjlt.com/news/321735.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

猜你喜欢
  • Android中Lifecycle的原理是什么
    本文小编为大家详细介绍“Android中Lifecycle的原理是什么”,内容详细,步骤清晰,细节处理妥当,希望这篇“Android中Lifecycle的原理是什么”文章能帮助大家解决疑惑,下面跟着小编的思路慢慢深入,一起来学习新知识吧。&...
    99+
    2023-06-29
  • Android中Lifecycle的原理详解
    目录一、基本使用二、LifecycleObserver接口和LifecycleOwner接口三、getLifecycle()四、绑定生命周期总结   &...
    99+
    2024-04-02
  • android lifecycle的用法是什么
    Android生命周期是指一个Android应用程序在从启动到结束的整个过程中所经历的状态变化。Android框架提供了一系列的方法...
    99+
    2023-10-18
    android
  • Android中Lint的原理是什么
    这篇文章将为大家详细讲解有关Android中Lint的原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。Lint 的工作过程lint 工具的代码扫描工作流:应用源文件:源文件包含组成 ...
    99+
    2023-06-14
  • Android中ViewPager的原理是什么
    ViewPager是Android中的一个布局容器控件,主要用于实现页面切换效果。它的原理是通过管理多个Fragment或View的...
    99+
    2023-09-25
    Android ViewPager
  • Android ANR的原理是什么
    本篇内容介绍了“Android ANR的原理是什么”的有关知识,在实际案例的操作过程中,不少人都会遇到这样的困境,接下来就让小编带领大家学习一下如何处理这些情况吧!希望大家仔细阅读,能够学有所成!一、ANR说明和原因1.1 简介A...
    99+
    2023-06-21
  • android leakcanary的原理是什么
    Android LeakCanary是一个用于检测内存泄漏的开源库。它的原理主要包括以下几个步骤:1. 监测对象的引用关系:Leak...
    99+
    2023-09-23
    android
  • Android的root原理是什么
    本篇内容主要讲解“Android的root原理是什么”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让小编来带大家学习“Android的root原理是什么”吧!0x00 关于rootlinux和类Unix系...
    99+
    2023-06-27
  • Android中的SurfaceFlinger工作原理是什么
    这篇文章将为大家详细讲解有关Android中的SurfaceFlinger工作原理是什么,文章内容质量较高,因此小编分享给大家做个参考,希望大家阅读完这篇文章后对相关知识有一定的了解。概念SurfaceFlinger是一个系统服务,如:au...
    99+
    2023-06-22
  • Android中AsyncTask的工作原理是什么
    这篇文章给大家分享的是有关Android中AsyncTask的工作原理是什么的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。概述实际上,AsyncTask内部是封装了Thread和Handler。虽然AsyncTa...
    99+
    2023-06-15
  • Android中的Coroutine协程原理是什么
    这篇文章主要介绍了Android中的Coroutine协程原理是什么,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。前言协程是一个并发方案。也是一种思想。传统意义上的协程是单线...
    99+
    2023-06-29
  • android glide原理是什么
    Glide是一种用于加载和显示图片的Android开源库。它使用了一种流畅且高效的方式来加载、缓存和显示图片,具有较低的内存占用和较...
    99+
    2023-09-22
    android
  • Android中Binder机制原理是什么
    Binder机制是Android系统中的一种进程间通信(IPC)机制,用于实现不同进程间的数据交互和方法调用。Binder机制的原理...
    99+
    2023-09-14
    Android
  • android Handler机制的原理是什么
    Android中的Handler机制是用来实现线程之间的通信的一种机制。它的原理是基于消息队列和消息循环。每个线程都有自己的消息队列...
    99+
    2023-09-20
    android
  • android线程池的原理是什么
    Android线程池的原理是通过管理和调度线程来实现并发执行任务的机制。线程池主要由线程池管理器、工作队列和线程池的线程组成。线程池...
    99+
    2023-09-23
    android
  • Android中setContentView加载布局的原理是什么
    Android中setContentView加载布局的原理是什么?相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。Activiy setContentView源码分析 p...
    99+
    2023-05-30
    android setcontentview
  • android binder机制原理是什么
    Android Binder机制是Android系统中用于进程间通信(IPC)的核心机制,它基于进程间通信的原理,实现了高效、安全、...
    99+
    2023-09-20
    android
  • android虚拟机原理是什么
    Android虚拟机的原理是将Android操作系统安装在主机操作系统上,通过虚拟化技术实现在主机上运行Android应用程序。具体...
    99+
    2023-10-12
    android
  • Handler在Android项目中的运行原理是什么
    这期内容当中小编将会给大家带来有关Handler在Android项目中的运行原理是什么,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。Handler先通过一个例子看一下 Handler 的用法。public...
    99+
    2023-05-31
    android handler roi
  • Android中网络请求加密的原理是什么
    这篇文章主要介绍了Android中网络请求加密的原理是什么的相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Android中网络请求加密的原理是什么文章都会有所收获,下面我们一起来看看吧。非对称加密加密我了解的不多...
    99+
    2023-06-04
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作