Android LifeCycle 源码学习总结

Android LiveData实现原理 Override@Override//获取当前生命周期状态//如果组件已销毁了,就移除观察return;/* 判断是否绑定 */@Override/* 移除观察 */@Override。 阅读详情

作者:入魔的冬瓜

整体设计

Lifecycle的核心设计模式就是观察者模式。

  • LifeCycleOwner 是被观察者,LifecycleObserver 是观察者。

  • 而LifecycleRegistry 像是个中介,管理观察者和被观察者,处理来自LifeCycleOwner 的事件,进行状态同步,并通知所有的LifecycleObserver。

LifeCycle

LifeCycle 的 State 和 Event

先看看 LifecycleRegistry 的父类,Lifecycle 的一些定义。

public abstract class Lifecycle {

    //添加Observer进来
    @MainThread
    public abstract void addObserver(@NonNull LifecycleObserver observer);

    //移除Observer
    @MainThread
    public abstract void removeObserver(@NonNull LifecycleObserver observer);

    //获取当前的State值
    @MainThread
    @NonNull
    public abstract State getCurrentState();

    //Event定义
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY
    }

    //State值
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}
  • 注意addObserver、removeObserver、getCurrentState这几个方法,都加上了@MainThread注解,所以在使用的过程中,尽量放在主线程进行调用,不然可能会引起一些崩溃问题。(多线程操作集合,可能引起 ArrayIndexOutOfBoundsException )
  • 事件驱动:LifecycleRegistry通过handleLifecycleEvent方法,接收外部发来的Event事件,修改内部的 State状态,并通知到所有的LifecycleObserver。

状态转换

先看下 State 和 Event 的关系图,再看下相关的代码。

  1. 通过 getStateAfter 方法,可以根据Event,获取下一步的State值。
  2. 从左往右,称为状态上升。
  3. 从右往左,称为状态下降。
  4. upEvent,根据当前观察者的状态值,获取下一步的Event(状态上升过程中会用到,后面再讲)
    static State getStateAfter(Event event) {
        switch (event) {
            case ON_CREATE:
            case ON_STOP:
                return CREATED;
            case ON_START:
            case ON_PAUSE:
                return STARTED;
            case ON_RESUME:
                return RESUMED;
            case ON_DESTROY:
                return DESTROYED;
            case ON_ANY:
                break;
        }
        throw new IllegalArgumentException("Unexpected event value " + event);
    }

    private static Event downEvent(State state) {
        switch (state) {
            case INITIALIZED:
                throw new IllegalArgumentException();
            case CREATED:
                return ON_DESTROY;
            case STARTED:
                return ON_STOP;
            case RESUMED:
                return ON_PAUSE;
            case DESTROYED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }

    private static Event upEvent(State state) {
        switch (state) {
            case INITIALIZED:
            case DESTROYED:
                return ON_CREATE;
            case CREATED:
                return ON_START;
            case STARTED:
                return ON_RESUME;
            case RESUMED:
                throw new IllegalArgumentException();
        }
        throw new IllegalArgumentException("Unexpected state value " + state);
    }

状态大小

因为State是枚举类型,并且枚举类型的compareTo方法是根据每个枚举的ordinal值大小进行比较的,所以状态大小:DESTROYED < INITIALIZED < CREATED < STARTED < RESUMED。

用到的场景例子:

LiveData#observe,默认只更新活跃状态的owner对象。(这里不过多分析LiveData的源码,只讲解一小部分逻辑)

public void observe(@NonNull LifecycleOwner owner,Observer<? super T> observer);
  1. LiveData,会调用considerNotify会去通知相应的观察者。
  2. 使用shouldBeActive()判断当前owner的生命周期状态。如果当前 observer 对应的 owner 非活跃状态,直接return。
  3. LifecycleBoundObserver的 shouldBeActive,判断当前状态至少是 State.STARTED。
  4. 这就解释了当 Activity 处于后台,对应的状态是 State.STARTED ,那就不会收到LiveData的事件了。
   //LiveData
    private void considerNotify(ObserverWrapper observer) {
        if (!observer.mActive) {
            return;
        }
        //
        if (!observer.shouldBeActive()) {
            observer.activeStateChanged(false);
            return;
        }
        if (observer.mLastVersion >= mVersion) {
            return;
        }
        observer.mLastVersion = mVersion;
        observer.mObserver.onChanged((T) mData);
    }

    //LifecycleBoundObserver
        class LifecycleBoundObserver extends ObserverWrapper implements LifecycleEventObserver {

        @Override
        boolean shouldBeActive() {
            return mOwner.getLifecycle().getCurrentState().isAtLeast(STARTED);
        }

        @Override
        public void onStateChanged(@NonNull LifecycleOwner source,
                @NonNull Lifecycle.Event event) {
            if (mOwner.getLifecycle().getCurrentState() == DESTROYED) {
                removeObserver(mObserver);
                return;
            }
            activeStateChanged(shouldBeActive());
        }

        @Override
        boolean isAttachedTo(LifecycleOwner owner) {
            return mOwner == owner;
        }

        @Override
        void detachObserver() {
            mOwner.getLifecycle().removeObserver(this);
        }
    }

LifecycleRegistry

LifecycleRegistry像是个中介,管理观察者和被观察者,处理事件分发和状态转换过程。

绑定被观察者
  • 通过构造方法,传入LifecycleOwner,也就是被观察者。一般情况下,对应的就是 Activity 或者 Fragment。
  • 通过mLifecycleOwner弱引用Activity、Fragment。方便垃圾回收,也可以防止如果 LifeCycleRegistry 泄漏的情况下,导致对应的组件被进一步泄漏。
  • ok,这一步比较简单。这样的话,LifecycleRegistry就持有被被观察者了。
    private final WeakReference<LifecycleOwner> mLifecycleOwner;

    public LifecycleRegistry(@NonNull LifecycleOwner,也就是被观察者。一般情况下, 指的就是Activity或者Fragment。
    provider) {
        mLifecycleOwner = new WeakReference<>(provider);
        mState = INITIALIZED;
    }
添加观察者

LifecycleRegistry#addObserver

FastSafeIterableMap
  • 所有的 Observer,最后会被保存到一个mObserverMap的集合里面
  • FastSafeIterableMap,本质上就是一个双向链表+HashMap的结构。(多搞一个HashMap,空间换时间,提高查询效率,解决链表遍历查询效率低的问题)
  • Map.Entry结构,包含前后节点的引用,自身的key、value值。

 private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap = new FastSafeIterableMap<>();

 public void addObserver(@NonNull LifecycleObserver observer) {
    ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);
    if (previous != null) {
            return;
    }
    //省略代码
 }
ObserverWithState
    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 = getStateAfter(event);
            mState = min(mState, newState);
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }
  • ObserverWithState,包装了原始的 LifecycleEventObserver(也就是 addObserver 里面的参数),通过dispatchEvent()通知状态变化,调用对应 Observer 的onStateChanged方法。
  • mState字段,保存当前 LifecycleObserver 的状态。为什么需要这个字段?
  1. 因为 LifeCycleRegistry 的状态与 LifecycleObserver 的状态不一定是一致的,需要不断将LifeCycleRegistry 的状态同步到每个 LifecycleObserver。
  2. 状态同步的过程是一步步的,并不是一次性直接修改state的值就行了,而是通过 dispatchEvent 一步步分发事件进行修改。
  3. 比如从 State.INITIALIZED 上升到 State.RESUMED 状态,LifecycleObserver 的 mState 会依次变成State.CREATED、STARTED,再变成 State.RESUME。(状态下降过程也是同个道理)
例子

场景举例:在Activity onResume的时候,添加一个新的LifecycleObserver。
输出结果:这个新添加的 LifecycleEventObserver,onStateChanged 会依次收到Event.ON_CREATE、Event.ON_START、Event.ON_RESUME的事件。

   @Override
    protected void onResume() {
        super.onResume();

        getLifecycle().addObserver(new LifecycleEventObserver() {
            @Override
            public void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event) {
                Log.d(TAG, "onStateChanged, event:"+event);
            }
        });
    }

//日志输出
onStateChanged, event:ON_CREATE
onStateChanged, event:ON_START
onStateChanged, event:ON_RESUME

分析过程:

  1. 对于这个新添加的 LifecycleEventObserver,一开始ObserverWithState里面的mState值是INITIALIZED,但是 LifecycleRegistry 此时的 State 是 RESUME。
  2. 通过calculateTargetState方法计算得出,需要将 ObserverWithState 里面的 mState 也是要修改到RESUME这个状态。
  3. 再通过一个white循环,依次调用dispatchEvent方法分发ON_CREATE、ON_START、ON_RESUME给 ObserverWithState#mLifecycleObserver,修改 ObserverWithState 里面的 mState ,直到跟LifecycleRegistry 的 State 状态一致。
  4. 其实这就是状态上升的一个过程。
事件分发与状态同步

LifeCycleOwner通过调用handleLifecycleEvent方法,分发相应的生命周期事件给到LifeCycleRegistry,LifeCycleRegistry 根据事件,同步状态,并通知所有的观察者。

    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);
        moveToState(next);
    }

    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            return;
        }
        mHandlingEvent = true;
        sync();
        mHandlingEvent = false;
    }

    private void sync() {
        while (!isSynced()) {
            mNewEventOccurred = false;
            // 状态下降
            if (mState.compareTo(mObserverMap.eldest().getValue().mState) < 0) {
                backwardPass(lifecycleOwner);
            }
            //状态上升
            Entry<LifecycleObserver, ObserverWithState> newest = mObserverMap.newest();
            if (!mNewEventOccurred && newest != null
                    && mState.compareTo(newest.getValue().mState) > 0) {
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }

    private boolean isSynced() {
        if (mObserverMap.size() == 0) {
            return true;
        }
        State eldestObserverState = mObserverMap.eldest().getValue().mState;
        State newestObserverState = mObserverMap.newest().getValue().mState;
        return eldestObserverState == newestObserverState && mState == newestObserverState;
    }

private void forwardPass(LifecycleOwner lifecycleOwner) {
    Iterator<Map.Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
            mObserverMap.iteratorWithAdditions();
    while (ascendingIterator.hasNext() && !mNewEventOccurred) {
        Map.Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
        ObserverWithState observer = entry.getValue();
        while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                && mObserverMap.contains(entry.getKey()))) {
            pushParentState(observer.mState);
            final Event event = Event.upFrom(observer.mState);
            if (event == null) {
                throw new IllegalStateException("no event up from " + observer.mState);
            }
            observer.dispatchEvent(lifecycleOwner, event);
            popParentState();
        }
    }
}
  1. getStateAfter():根据 Event,获取下一个State值(也就是上面的那张状态装换图逻辑)
  2. moveToState():移动到当前的 State 状态。
  3. sync():同步状态,更新队列中所有 Observer 的状态,并调用所有观察者的onStateChanged。
  4. isSynced():判断是否状态同步完成:队列头和队列尾的State与LifecycleRegistry的State一致,则说明状态同步过程结束。
  5. backwardPass():进行状态下降的一个过程。(从右往左)
  6. forwardPass():进行状态上升的一个过程。(从左往右)

forwardPass 方法实现:
第一层while循环,遍历队列里面的所有 Observer。
第二层while循环,对每个 Observer 的mState进行一步步上升,并调用dispatchEvent进行通知,直接与 LifecycleRegistry 的 State 一致。

LifeCycleOwner

LifecycleOwner:被观察者,持有Lifecycle对象。Activity 和 Fragment 都实现了 LifecycleOwner ,标志着他们是具有生命周期的组件。

生命周期事件分发实现

  • 对于 Activity 生命周期事件的分发,是通过一个ReportFragment进行处理的。ReportFragment是一个没有ui的 fragment。
  • 在ComponentActivity#onCreate的时候,注入添加了一个ReportFragment。因为 Fragment 依赖于创建它的 Activity,所以 Fragment 的生命周期会和宿主 Activity 生命周期同步,这样就间接实现了监听 Activity 生命周期的功能。
  • 在 ReportFragment 相应的生命周期方法中,通过ReportFragment#dispatch方法,将 Activity 生命周期事件的分发给LifecycleRegistry。
  • LifecycleRegistry 进行状态同步,并通知所有的 Observer。

LifecyclerObserver

观察者,可以监听对应LifecycleOnwer的生命周期变化。比较简单,不细讲了。
讲一下在实际应用中,可能需要注意的问题。

addObserver要放主线程

//省略部分代码
private ArrayList<State> mParentStates = new ArrayList<>();

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;
    }
    State targetState = calculateTargetState(observer);
    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);
    }
}

private State calculateTargetState(LifecycleObserver observer) {
    Entry<LifecycleObserver, ObserverWithState> previous = mObserverMap.ceil(observer);

    State siblingState = previous != null ? previous.getValue().mState : null;
    State parentState = !mParentStates.isEmpty() ? mParentStates.get(mParentStates.size() - 1)
            : null;
    return min(min(mState, siblingState), parentState);
}
  1. addObserver 新增观察者,会有一个状态同步的过程。中间用到mParentStates。
  2. mParentStates:这是一个通过popParentState和pushParentState更新的栈。主要是在状态同步过程中,执行订阅者的回调 dispatchEvent 前,先将订阅者当前状态 pushParentState 压入栈,在回调结束之后, popParentState 出栈
  3. mParentStates是个ArrayList,ArrayList不是线程安全的
  4. 所以如果有多个线程在同时执行addObserver这个过程,就可能引起崩溃。

检测 addObserver 是否在主线程

以 Activity 为例。

  1. 项目中一般会有个基类 Activity ,可以直接重写BaseActivity 的getLifecycle方法,返回一个新的LifecycleRegistry就行。
  2. 通过这个新的 LifecycleRegistry ,重写 addObserver方法,就可以拦截到所有监听 Activity 生命周期的Observer 了。
  3. 检测当前线程,是否是主线程。不是在主线程的话,可以打印相关的堆栈信息,提示开发者进行修改
abstract class BaseActivity : AppCompatActivity() {

    //本地开发阶段,如果在非主线程addObserver的话,直接打个error日志或者throw exception,提示开发者进行修改
    var customLifeCycle: CustomLifeCycle? = null

    override fun getLifecycle(): Lifecycle? {
        if (DEBUG) {
            if (customLifeCycle == null) {
                customLifeCycle = CustomLifeCycle(this)
            }
            return customLifeCycle
        }
        return super.getLifecycle()
    }
}

class CustomLifeCycle extends LifecycleRegistry {

    public CustomLifeCycle(@NonNull LifecycleOwner provider) {
        super(provider);
    }

    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        //判断是否在主线程
        if (Looper.getMainLooper() != Looper.myLooper()){
            throw new IllegalStateException("addObserver need in main thread");
        }
        super.addObserver(observer);
    }
}
【Android Jetpack高手日志】Lifecycle 从入门到精通 支持库 26.1.0 及更高版本中的 Fragment 和 Activity 已实现接口。如果你有一个自定义类并希望使其成为,可以使用类,但需要将事件转发到该类,代码如下:) {该 MainActivty 是实现了 Activity 类,而不是 AppcompatActivity(FragmentActivity) 类,所以需要这样的处理。我们来看看 FragmentActivity 中的源码,比如onCreate方法和onPause方法/***/······@Override··· 阅读详情

相关推荐

Android最全【Android Jetpack高手日志】Lifecycle 从入门到精通,2024年最新面试总结和面试感想

支持库 26.1.0 及更高版本中的 Fragment 和 Activity 已实现接口。如果你有一个自定义类并希望使其成为,可以使用类,但需要将事件转发到该类,代码如下:) {该 MainActivty 是实现了 Activity 类,而不是 AppcompatActivity(FragmentActivity) 类,所以需要这样的处理。我们来看看 FragmentActivity 中的源码,比如onCreate方法和onPause方法/***/······@Override···

2301_77595001的博客 473

Lifecycle详解

非常容易的将Activity/Fragment的生命周期方法抽离出来。直接使用getLifecycle()方法获取Lifecycle对象。直接使用getLifecycle()方法获取Lifecycle对象。既可以在具体的生命周期方法中获取状态也可以继续添加其他的观察者。自定义类实现LifecycleObserver接口。都是实现LifecycleObserver接口。onStop方法的owner是CREATED。onStop方法的owner是CREATED。LifecycleObserver接口。

听海的博客 1469

营销反作弊之 异常行为分析模型(一),附带python代码

通过对用户行为进行深入的分析,识别出与常规模式不符的异常行为,可以有效检测并阻止虚假广告点击、刷单、点击欺诈等欺诈行为。本文将详细探讨营销反欺诈中异常行为分析的方法,介绍如何通过数据采集、清洗、行为建模与异常检测,准确识别潜在的欺诈行为,并提供 Python 实现代码示例。**监督学习 (Supervised Learning):**在标注数据的帮助下,训练机器学习模型使其能预测未知数据的结果。营销反欺诈异常行为分析的整体流程涉及多个环节,确保通过对用户行为的深入分析,及时识别潜在的欺诈行为。

viviwiky的博客 1231

Android Jetpack 之 lifecycle入门,简单使用及分析

Lifecycle入门一、Lifecycle简介二、简单使用三、简单分析 一、Lifecycle简介 Lifecycle是Jetpack架构组件之一,是一个生命周期感知型组件。 作用就是使一个组件可以感知到另一个组件(如 Activity 和 Fragment)的生命周期状态的变化。 在未使用生命周期感知型组件时,有一种常见模式,就是在生命周期方法中对依赖组件进行操作,例如,在Activity OnCreate()时调用组件内部的start()方法开启组件的功能,在Activity OnDestroy()时

weixin_44902943的博客 651

FDTD远场分析实战:从monitor数据到3D远场可视化的完整流程

本文详细介绍了FDTD远场分析的完整流程,从monitor采集的近场数据出发,通过近场-远场变换(NFFFT)生成3D远场可视化结果。文章重点解析了远场转换的物理原理、关键参数设置,并提供了构建稳健数据处理流水线及高级可视化(如3D辐射方向图)的实战脚本与技巧,适用于天线设计与光学器件分析。

weixin_29063035的博客 228

LTE信令流程及业务流程

eNB返回E-RAB建立响应消息,E-RAB建立列表信息中包含成功建立的承载信息,E-RAB建立失败列表消息中包含没有成功建立的承载消息。3)当下行数据达到时,网络侧先对UE进行寻呼,随后UE发起随机接入过程,并发起service request过程。用户面:S-GW向eNB发送承载建立请求,包含(IMSI, QoS, TFT, TEID, LBI等)控制面:MME向eNB发送E-RAB建立请求,包含E-RAB ID,QoS,S-GW TEID。3)在S1接口上建立S1承载,在Uu接口上建立数据无线承载。

qq_44390640的博客 4584

Fragment的Lifecycle使用

在Fragment中直接调用可以获取到Fragment当前的状态: getLifecycle().getCurrentState() 该状态可以进行判断,比如,是否在某个状态后: getLifecycle().getCurrentState().isAtLeast(xxx) xxx处填写状态枚举类: Lifecycle.State.INITIALIZED Lifecycle.State.CRE...

qq_17767113的博客 2912

【思博伦】史上最详细Spirent TestCenter测试仪使用教程精讲(一)!图解超赞超详细!!!

3. 在弹出的界面中,找到菜单栏中的“Connect/Create”,选择下拉框中的“Connect to Physical/Visual Chassis”,在弹出的对话框中输入思博伦测试仪的IP地址:192.168.6.244,点击“OK”;说明:目前我们只需要使用到Raw Stream Block,不需要用到Bound Stream Block。说明:如果要使用100G模式,由于硬件限制,必须连续3个面板端口同时配置为100G使用。打开安装包,并按照提示按照即可。

风云说通信 6481

Jetpack:LifeCycle全面解析(包含检测app启动、进入前台

onCreate 在应用程序整个生命周期中只调用一次onStart 当应用程序出现在前台的时候被调用onResume 当应用程序出现在前台的时候被调用onPause 当应用程序退到后台时调用onStop 当应用程序退到后台时调用onDestroy 不调用当应用程序从。

2401_83621004的博客 565

OpenCV 实战篇——如何测算出任一副图片中的物体的实际尺寸?传感器尺寸与像元尺寸的关系?

本文介绍了通过相机图像测算物体实际尺寸的方法,重点分析了传感器参数与成像质量的关系。文章首先给出了物体实际尺寸的计算公式,涉及像素尺寸、距离、分辨率等参数。然后详细解析了传感器尺寸与像元尺寸的关系,指出相同分辨率下更大的传感器能获得更好的成像质量。此外还介绍了光学尺寸、像素尺寸对成像的影响,以及帧率的概念。最后提及了相机标定的重要性,并概述了从像素坐标系转换到世界坐标系的基本思路。这些知识为通过相机图像进行精确测量提供了理论基础。

程序员,他们想的是什么?他们想的永远都是技术,他们崇尚的也永远都是技术。 1338

48、量子系统中的信源编码

本文深入探讨了量子系统中的信源编码理论与应用,详细介绍了盲编码与可见编码、定长编码与变长编码四种主要信源编码方案。文章从经典信源编码出发,对比分析了量子场景下的压缩特性,并系统性地阐述了量子定长信源编码的构建方法及相关定理证明。同时,讨论了通用量子定长信源编码的设计思路及其在实际应用中的优势与挑战。通过理论分析与实验进展的结合,为量子信息存储、传输和处理提供了重要的理论基础和技术支持。

m2n3b4v5c6的博客 102

Android architecture components学习笔记1-Lifecycle源码分析

Android architecture components学习笔记-Lifecycle源码分析 我们知道在安卓的开发中,出现过很多的架构,从最开始的直接4大组件开撸的类mvc,到后来的mvp,mvvm。有鉴于此,google也终于在2017年的IO开发大会上推出了Android Architecture Components(AAC)来帮助Android开发者构建更好的app架构。 A...

hyc1988107的博客 846

通过WorkVisual连接KUKA机器人的具体方法

通过WorkVisual连接KUKA机器人的具体方法

Robot_PLC_HMI_Automation 6848

Android(kotlin)JetPack系列学习——1. Lifecycle(含源码)

lifeCycle主要是用来解耦的,LifeCycle可以帮助开发者创建可感知生命周期的组件。这样,组件便能够在其内部管理自己的生命周期,从而降低模块间的耦合度,并降低内存泄漏发生的可能性。LifeCycle不只对Activity/Fragment有用,在Service和Application中也能大显身手。使用Lifecycle解耦页面与组件使用LifecycleService解耦Service与组件使用ProcessLifecycleOwner监听应用程序周期。

qq_41915623的博客 1344

全网最全-QCC51xx-QCC30xx(TWS)系列从入门到精通开发教程汇总(持续更新中)

QCC3040开发笔记之基本介绍(0) QCC3040开发笔记之开发环境搭建(1) QCC3040开发笔记之debug调试(trb调试,usbt调试,adb调试,WIFI调试)(2) QCC3040开发笔记之按键配置(3) QCC3040开发笔记之按键切换(4) QCC3040开发笔记之按键逻辑(5) QCC3040开发笔记之tone(6) QCC3040开发笔记之提示音(7) QCC3040开发笔记之bitserial接口(8) QCC3040开发笔记之双mic+AEC+ANC(9...

心跳包的博客 3万+

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

Android lifecycle 实战及使用进阶

Android Architecture Components 的,前面我们已经讲解了 lifecycle, LiveData 的使用及原理,今天,让我们一起赖看看 lifecycle 在项目中的实战。主要讲解两点LifecycleHandler 的封装MVP 中引入 lifecycle,可以自行监听 activity 生命周期变化LifecycleHandle 的封装。

2401_87029240的博客 894

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

Android 进阶(JetPack)

Android 进阶(源码学习)

ikunhuaji的博客 660

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

Lifecycle 流程分析

前言 为了帮助开发者更高效,更容易地构建优秀的应用,在 2018 Google IO 大会上,谷歌正式推出了 Android Jetpack Components 系列架构组件。本文的主题是 Lifecycle,它可以有效的避免内存泄漏,和解决 Android 中生命周期常见的难题。 在最近学习官方的架构组件时,我询问了我的朋友,他指导我的学习顺序为:Lifecycle - ViewModel -...

I13kmsteady的博客 700

一文搞懂Android-JetPack组件原理之Lifecycle、LiveData、ViewModel与源码分析技巧

自底向上的方式分析源码主要在于分析前问题的提出,上面应用了软件过程中的输入、处理和输出这三个角度提出问题,算是比较通用的一种方式。问题提出后,便可以以解决问题为目的分析源码,不至于在茫茫源码中迷失了方向。解决完问题,紧接着把源码的主要流程梳理一遍,做出总结,即可以加深对原理的理解。

2401_84415534的博客 913

一文搞懂Android-JetPack组件原理之Lifecycle、LiveData、ViewModel与源码分析技巧(1)

为了对分析工作有个感性认识,先过一下各个组件的作用和简单用法。LifecycleLifecycle可以方便我们处理Activity和Fragment的生命周期,可以将一些逻辑更加内聚和解耦,比如把资源的释放操作从Activity的回调代码中解耦出来,放到资源管理类中自动进行。该组件是后两个组件的基石,理解它的原理也有助于我们理解LiveData是如何保证不会造成内存泄漏的。下面是一个简单的使用示例,在自定义LifecycleObserver的实现接口上,用注解的方式声明与生命周期相关联的方法。

2401_84909917的博客 828

JetPack组件--LifeCycle生命周期组件详解,2024年最新阿里面试几轮 p7

Android进阶学习全套手册Android对标阿里P7学习视频BATJ大厂Android高频面试题最后,借用我最喜欢的乔布斯语录,作为本文的结尾:人这一辈子没法做太多的事情,所以每一件都要做得精彩绝伦。你的时间有限,所以不要为别人而活。不要被教条所限,不要活在别人的观念里。不要让别人的意见左右自己内心的声音。最重要的是,勇敢的去追随自己的心灵和直觉,只有自己的心灵和直觉才知道你自己的真实想法,其他一切都是次要。

2401_84167072的博客 1076

《重学安卓》两周年,回顾与展望

在过去两年里,我们以 “架构组件” 为话题,不遗余力地在每篇文章中贯彻落实在 “深度思考” 的帮助下,以及基于对大量样本的追踪和反思,我们独树一帜地从软件工程的视角出发抓住本质,并开源了一系列高频使用的仓库,包括 腾讯音乐、BMW、TCL 等知名厂商的软件,都在使用我们正在维护的等仓库。

2401_84123171的博客 821

全网最全:Jetpack AAC(-)解析

在Activity中调用getLifecycle()能获取到Lifecycle实例,那getLifecycle()是哪里定义的方法呢?是接口LifecycleOwner,顾明来思义,生命周期拥有者:/*** 生命周期拥有者* 生命周期事件可被 自定义的组件 用来 处理生命周期事件的变化,同时不会在Activity/Fragmen中写任何代码*/@NonNull。

2401_84149724的博客 324
上一篇: Android 面试基础坑,你掉进去过几次?
下一篇: Android 开发们的现状通病~
懂你的大海
博客等级 码龄6年 9049粉丝 1381原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值