Jetpack组件之lifeCycle

2019-11-17  本文已影响0人  feifei_fly

一、声明周期的概念

1、Lifecycle 是一个抽象类,

它只有三个方法

lifeCycle中 有Event和State的定义。
事件分为以下几种:

public abstract class Lifecycle {

        //注册LifecycleObserver (比如Presenter)
        public abstract void addObserver(@NonNull LifecycleObserver observer);
        //移除LifecycleObserver 
        public abstract void removeObserver(@NonNull LifecycleObserver observer);
        //获取当前状态
        public abstract State getCurrentState();

        public enum Event {
            ON_CREATE,
            ON_START,
            ON_RESUME,
            ON_PAUSE,
            ON_STOP,
            ON_DESTROY,
            ON_ANY
        }
        
       public enum State {
            DESTROYED,
            INITIALIZED,
            CREATED,
            STARTED,
            RESUMED;

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

2、LifecycleOwner 声明周期的拥有者

LifecycleOwner 是一个接口,仅有一个方法getLifecycle()返回一个LiefCycle对象

public interface LifecycleOwner {
    /**
     * Returns the Lifecycle of the provider.
     *
     * @return The lifecycle of the provider.
     */
    @NonNull
    Lifecycle getLifecycle();
}

3、LifeCycleObserver

LifeCycleObserver 生命周期观察者,是一个interface,它不包含任何方法,它仅仅起一个标记的作用,标记某个类是一个LifeCycleOwner。

/**
 * Marks a class as a LifecycleObserver. It does not have any methods, instead, relies on
 * {@link OnLifecycleEvent} annotated methods.
 * <p>
 * @see Lifecycle Lifecycle - for samples and usage patterns.
 */
@SuppressWarnings("WeakerAccess")
public interface LifecycleObserver {

}

但是可以通过OnLifecycleEvent 注解来监听特定的生命周期

4、lifeCycleObsever通过监听LifeCycle,可以感知声明周期的状态

lifeCycle.addObserver(LifeCycleObserver)

二、lifeCycle的简单应用

1、Activity实现了LifeCycleOwner

public class FragmentActivity extends ComponentActivity implements
        ActivityCompat.OnRequestPermissionsResultCallback,
        ActivityCompat.RequestPermissionsRequestCodeValidator {
        }
public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        LifecycleOwner,
        ViewModelStoreOwner,
        SavedStateRegistryOwner,
        OnBackPressedDispatcherOwner {
    
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
    @NonNull
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }

}

2、LifecycleRegistry

LifeCycle是一个抽象类,LifecycleRegistry 是LifeCycle的一个经典的实现类。Activity和Fragment中的LifeCycle的实现类都是LifecycleRegistry

LifecycleRegistry 中持有一个Map,保存所有添加到该lifeCycle的LifeCycleObserver,声明周期发生变化时,会向该map中的所有Observer同步。

public class LifecycleRegistry extends Lifecycle {

    /**
     * Custom list that keeps observers and can handle removals / additions during traversal.
     */
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();
}

3、监听Activity中声明周期的实例

通过@OnLifecycleEvent(Lifecycle.Event.ON_ANY)指定fun onEvent()函数监听所有的生命周期事件

class TestLifeCycle :LifecycleObserver{


    /**
     * Lifecycle.Event.ON_ANY 监听所有的声明周期事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public fun onEvent(owner: LifecycleOwner, event: Lifecycle.Event) {
        Log.d("feifei","onEvent ${event},LifecycleOwner:${owner}")
    }

    /**
     * 指定监听 生命周期中的ON_CREATE事件
     */
    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public fun onCreate(){
        Log.d("feifei","TestLifeCycle onCreate ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public fun onStart(){
        Log.d("feifei","TestLifeCycle onStart ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public fun onResume(){
        Log.d("feifei","TestLifeCycle onResume ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public fun onPause(){
        Log.d("feifei","TestLifeCycle onPause ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public fun onStop(){
        Log.d("feifei","TestLifeCycle onStop ")
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public fun onDestory(){
        Log.d("feifei","TestLifeCycle onDestory ")
    }
}

class MainActivity : FragmentActivity() {

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        lifecycle.addObserver(TestLifeCycle())
        Log.d("feifei","MainActivity onCreate")
    }

    override fun onStart() {
        super.onStart()
        Log.d("feifei","MainActivity onStart")
    }

    override fun onResume() {
        super.onResume()
        Log.d("feifei","MainActivity onResume")
    }

    override fun onPause() {
        super.onPause()
        Log.d("feifei","MainActivity onPause")
    }

    override fun onStop() {
        super.onStop()
        Log.d("feifei","MainActivity onStop")
    }

    override fun onDestroy() {
        super.onDestroy()
        Log.d("feifei","MainActivity onDestroy")
    }
}

日志输出:

2019-11-17 21:51:46.067 30667-30667/com.example.testlifecycle D/feifei: MainActivity onCreate
2019-11-17 21:51:46.070 30667-30667/com.example.testlifecycle D/feifei: onEvent ON_CREATE,LifecycleOwner:com.example.testlifecycle.MainActivity@33b2075
2019-11-17 21:51:46.073 30667-30667/com.example.testlifecycle D/feifei: MainActivity onStart
2019-11-17 21:51:46.074 30667-30667/com.example.testlifecycle D/feifei: onEvent ON_START,LifecycleOwner:com.example.testlifecycle.MainActivity@33b2075
2019-11-17 21:51:46.081 30667-30667/com.example.testlifecycle D/feifei: MainActivity onResume
2019-11-17 21:51:46.083 30667-30667/com.example.testlifecycle D/feifei: onEvent ON_RESUME,LifecycleOwner:com.example.testlifecycle.MainActivity@33b2075
2019-11-17 21:52:04.287 30667-30667/com.example.testlifecycle D/feifei: onEvent ON_PAUSE,LifecycleOwner:com.example.testlifecycle.MainActivity@33b2075
2019-11-17 21:52:04.291 30667-30667/com.example.testlifecycle D/feifei: MainActivity onPause
2019-11-17 21:52:04.319 30667-30667/com.example.testlifecycle D/feifei: onEvent ON_STOP,LifecycleOwner:com.example.testlifecycle.MainActivity@33b2075
2019-11-17 21:52:04.340 30667-30667/com.example.testlifecycle D/feifei: MainActivity onStop

三、生命周期执行顺序

在FragmentActivity中

public class FragmentActivity implements xxx, LifecycleOwner {
    //...
    void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);  //1.先执行生命周期方法
        //...省略代码
        //2.生命周期事件分发
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE);
    }

    void performStart() {
        super.onStart();
        //...
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
    }

    void performResume() {
         super.onResume();
        //...
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
    }

    void performPause() {
        //3.注意,调用顺序变了
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_PAUSE);
        //...
        super.onPause();
    }

    void performStop() {
       mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_STOP);
        //...
        super.onStop();
    }

    void performDestroy() {
        mFragmentLifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_DESTROY);
        //...
        super.onDestroy();
    }
}

为什么这样实现?

我想是因为通常声明周期的场景是
在actvity.onCreate()之后 执行一下初始化操作
在actvity.onDestory()之前,执行一些资源释放操作

而通过lifeCycle来向外传递生命周期到LifeCycleObserver 做资源的初始化和释放。
那么LifeObserver

四、参考文章

https://www.jianshu.com/p/b1208012b268

上一篇下一篇

猜你喜欢

热点阅读