androd lifecycle

65 阅读7分钟

Android Lifecycle

Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:

事件

从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。

状态

Lifecycle 对象跟踪的组件的当前状态。

如下图: lifecycle.svg

Lifecycle是如何跟踪Activity的生命周期的呢?Activity刚打开,此时Lifecycle State处于INITIALIZED , Lifecycle不分派事件,Activity生命周期达到onCreate时,Lifecycle State转变为CREATED , 分派一个ON_CREATE事件,Activity生命周期到达onStart() ,Lifecycle State变为STARTED ,分派ON_START事件,依此图类推,需要注意:STATE没有PAUSED 或者 STOPED状态,为什么没有?Lifecycle服务于MVVM架构,STATE的状态应该尽可能精简 ,可以结合Activity切换时的生命周期去理解

Lifecycle.java

public abstract class Lifecycle {
 ....
 ....    
    // 事件,对应Activity,或者Fragment的生命周期,ON_ANY是一个补齐字段,一般无须特别关注
    public enum Event {
       
        ON_CREATE,
        
        ON_START,
       
        ON_RESUME,
        
        ON_PAUSE,
       
        ON_STOP,
       
        ON_DESTROY,
       
        ON_ANY
    }

	//状态,对应Activity或者Fragment不同生命周期,表示当前处于生命状态
    //可以看到onPause()和onStop()分别对应到了STARTED 和 CREATED状态
    public enum State {
       
        DESTROYED,
     
        INITIALIZED,

     
        CREATED,

     
        STARTED,

    
        RESUMED;

        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}

简单用法

/ MainActiviy.kt
class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)
        lifecycle.addObserver(Observer())
    }
}

// MainActObserver.kt
class Observer : LifecycleObserver {
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    fun onCreate() {
        // on create
        Log.e("test","onCreate");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    fun onResume() {
       // onResume
        Log.e("test","onResume");
    }

Log会打印出 onCreate 和 onResume ,我们可以在Observer中感知到Activity的生命周期了

源码分析

Lifecycle的源码并不复杂,下来从看一下LifecycleObserver是如何收到Activity的生命周期回调的

   // ComponentActivity
	@NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

lifecycle.addObserver(Observer())实质是mLifecycleRegistry.addObserver(Observer())

// ComponentActivity
private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this); 

LiefcycleRegistery.addObserver()

  @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        State initialState = mState == DESTROYED ? DESTROYED : INITIALIZED;// 拿到初始状态
        ObserverWithState statefulObserver = new ObserverWithState(observer, initialState);//包装类ObserverWithState
        // 把observer当做key,添加过包装过的ObserverWithState对象,如果之前已经注册过,那么返回老的包装对象;
        ObserverWithState previous = mObserverMap.putIfAbsent(observer, statefulObserver);// 将ObserverWithState放到mObserverMap里

        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);// 计算observer添加时处于的State
        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--;
    }

	 /*mParentStates的用处在于嵌套添加,比如有A和B两个Obserser,在A的onStart回调里面执行removeObserver(A), addObserver(B),执行dispatchEvent	的时候,当mObserverMap里面只有一个ObserverA,首先会移除ObserverA,然后添加B,B在添加的时候需要给自己状态设置为A所在的状态,但是mObserverMap里面已	   经找不到A了,B的状态就需要从mParentStates里面同步,所以每次dispatchEvent都需要考虑这种极端情况;*/
    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);
    }

上面是一个典型的观测者模式的代码,observer被包装成一个ObserverWithState来作为真正的关注者,sync();是生命周期同步过程,里面通知所有观测者生命周期的分发

    // happens only on the top of stack (never in reentrance),
    // so it doesn't have to take in account parents
    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()) { // 是否已经同步过生命周期,false时执行while
            mNewEventOccurred = false;
            // no need to check eldest for nullability, because isSynced does it for us.
            // mObserverMap实质是一个链表,每一个element是一个键值对的entry,eldest()返回的是最先添加到表中的元素
            //当前的生命周期mState和最先添加的Observer的state比对, < 0 ,表示需要回退Observer的生命周期事件
            // 比如当前Activity处于onCreate,但是Observer里面记录的是onDestory,那么需要给Observer同步一个onCreate事件;
            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) {
                // 同理,表示需要向前同步Observer的生命周期,比如当前Activity处于RESUMED,但是Observer是ON_CREATE,那么需要触发ON_START
                forwardPass(lifecycleOwner);
            }
        }
        mNewEventOccurred = false;
    }
	
	// 遍历mObserverMap,发送订阅事件,注意这里事件的顺序是down事件
	//比如当前mState是RESUMED,observer的状态是CREATED,那么observer需要从CREATED变为RESUMED,需要经历的生命周期onStart,onResume
	//这个时候就需要发送两次事件.第一个while是遍历observer,第二个while是遍历需要同步的生命周期
    private void forwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> ascendingIterator =
                mObserverMap.iteratorWithAdditions();
        while (ascendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = ascendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) < 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                pushParentState(observer.mState);
                observer.dispatchEvent(lifecycleOwner, upEvent(observer.mState));// 分发生命周期事件;
                popParentState();
            }
        }
    }

	// 遍历mObserverMap,发送订阅事件,注意这里事件的顺序是down事件
    private void backwardPass(LifecycleOwner lifecycleOwner) {
        Iterator<Entry<LifecycleObserver, ObserverWithState>> descendingIterator =
                mObserverMap.descendingIterator();
        while (descendingIterator.hasNext() && !mNewEventOccurred) {
            Entry<LifecycleObserver, ObserverWithState> entry = descendingIterator.next();
            ObserverWithState observer = entry.getValue();
            while ((observer.mState.compareTo(mState) > 0 && !mNewEventOccurred
                    && mObserverMap.contains(entry.getKey()))) {
                Event event = downEvent(observer.mState);
                pushParentState(getStateAfter(event));
                observer.dispatchEvent(lifecycleOwner, event);// 分发生命周期事件;
                popParentState();
            }
        }
    }

ObserverWithState.java

    static class ObserverWithState {
        State mState;
        LifecycleEventObserver mLifecycleObserver;

        ObserverWithState(LifecycleObserver observer, State initialState) {
            // observer被包装成mLifecycleObserver
            mLifecycleObserver = Lifecycling.lifecycleEventObserver(observer);
            mState = initialState;
        }
        //分发生命周期方法
        void dispatchEvent(LifecycleOwner owner, Event event) {
            State newState = getStateAfter(event);
            mState = min(mState, newState);
            // 实际调用mLifecycleObserver.onStateChanged()方法;
            mLifecycleObserver.onStateChanged(owner, event);
            mState = newState;
        }
    }

LifecycleEventObserver.java

...
...
    // 生成生命周期回调的适配器,不在更多描述
     @NonNull
    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;
        }

        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);
                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);
    }

上述代码描述的是Lifecycle执行生命周期同步的具体步骤,但是Lifecycle是如何感知到Activity或者Fragment生命周期变化呢?

我们使用的AppCompatActivity是ComponentActivity.java的子类

    //ComponentActivity onCrate里面注入了一个ReportFragemnt,联想一下Glide
	@SuppressLint("RestrictedApi")
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        ReportFragment.injectIfNeededIn(this);
    }

ReportFragment.java

public class ReportFragment extends Fragment {
    private static final String REPORT_FRAGMENT_TAG = "androidx.lifecycle"
            + ".LifecycleDispatcher.report_fragment_tag";
	// 将ReportFragment添加到Activity中作为Activity生命周期的监听;
    public static void injectIfNeededIn(Activity activity) {
        // ProcessLifecycleOwner should always correctly work and some activities may not extend
        // FragmentActivity from support lib, so we use framework fragments for activities
        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();
        }
    }

    static ReportFragment get(Activity activity) {
        return (ReportFragment) activity.getFragmentManager().findFragmentByTag(
                REPORT_FRAGMENT_TAG);
    }

    private ActivityInitializationListener mProcessListener;

    private void dispatchCreate(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onCreate();
        }
    }

    private void dispatchStart(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onStart();
        }
    }

    private void dispatchResume(ActivityInitializationListener listener) {
        if (listener != null) {
            listener.onResume();
        }
    }

    @Override
    public void onActivityCreated(Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
        dispatchCreate(mProcessListener);
        dispatch(Lifecycle.Event.ON_CREATE);//发出Lifecycle.Event.ON_CREATE
    }

    @Override
    public void onStart() {
        super.onStart();
        dispatchStart(mProcessListener);
        dispatch(Lifecycle.Event.ON_START);//发出(Lifecycle.Event.ON_START
    }

    @Override
    public void onResume() {
        super.onResume();
        dispatchResume(mProcessListener);
        dispatch(Lifecycle.Event.ON_RESUME);
    }

    @Override
    public void onPause() {
        super.onPause();
        dispatch(Lifecycle.Event.ON_PAUSE);
    }

    @Override
    public void onStop() {
        super.onStop();
        dispatch(Lifecycle.Event.ON_STOP);
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
        dispatch(Lifecycle.Event.ON_DESTROY);
        // just want to be sure that we won't leak reference to an activity
        mProcessListener = null;
    }
    // 分发生命周期事件
    private void dispatch(Lifecycle.Event event) {
        Activity activity = getActivity();
        if (activity instanceof LifecycleRegistryOwner) {
            ((LifecycleRegistryOwner) activity).getLifecycle().handleLifecycleEvent(event);
            return;
        }
        // Activity实现了LifecycleOwner接口,getLifecycle()返回mLifecycleRegistry,所以实际调用的是mLifecycleRegistry的
        //handleLifecycleEvent(event),从而Activity的生命周期被Lifecycle感知到
        // Fragment里面与Activity不同,Fragment是在生命周期里面主动调用LifecycleRegistry的handleLifecycleEvent(event)
        if (activity instanceof LifecycleOwner) {
            Lifecycle lifecycle = ((LifecycleOwner) activity).getLifecycle();
            if (lifecycle instanceof LifecycleRegistry) {
                ((LifecycleRegistry) lifecycle).handleLifecycleEvent(event);
            }
        }
    }

    void setProcessListener(ActivityInitializationListener processListener) {
        mProcessListener = processListener;
    }

    interface ActivityInitializationListener {
        void onCreate();

        void onStart();

        void onResume();
    }
}
    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        State next = getStateAfter(event);// 根据事件找到对应State的状态
        moveToState(next);// 同步状态
    }

	// 与上面的图对应
    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 void moveToState(State next) {
        if (mState == next) {
            return;
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        sync();// 开始同步state
        mHandlingEvent = false;
    }

补充

常用Lifecycle的LifecycleObserver

  •   public interface LifecycleEventObserver extends LifecycleObserver {
          /**
           * Called when a state transition event happens.
           *
           * @param source The source of the event
           * @param event The event
           */
          void onStateChanged(@NonNull LifecycleOwner source, @NonNull Lifecycle.Event event);
      }
    
  •   interface FullLifecycleObserver extends LifecycleObserver {
    
          void onCreate(LifecycleOwner owner);
    
          void onStart(LifecycleOwner owner);
    
          void onResume(LifecycleOwner owner);
    
          void onPause(LifecycleOwner owner);
    
          void onStop(LifecycleOwner owner);
    
          void onDestroy(LifecycleOwner owner);
      }
    
  • // MainActObserver.kt
     class Observer : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE) // 这种Observer是通过获取方法的注解来调用生命周期方法,方法的名称可以随意命名
        fun onCreate() {
            // on create
            Log.e("test","onCreate");
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onResume() {
           // onResume
            Log.e("test","onResume");
        }