Lifecycle使用方法、原理分析

360 阅读4分钟

Jetpack系列:
Lifecycle使用方法、原理分析 - 掘金 (juejin.cn)
LiveData使用方法、原理分析 - 掘金 (juejin.cn)
ViewModel使用方法、原理分析(一) - 掘金 (juejin.cn)
ViewModel使用方法、原理分析(二) - 掘金 (juejin.cn)
自定义View中获取ViewModel - 掘金 (juejin.cn)

生命周期是Android四大组件核心特性之一,也是Android视图View开发需要重点关注问题。
Lifecycle生命周期感知型组件可执行操作来响应另一个组件(如 activity 和 fragment)的生命周期状态的变化。这些组件有助于您写出更有条理且往往更精简的代码,这样的代码更易于维护

Lifecycle使用方法

gradle依赖参考官方文档,集成最新版本

//Lifecycle基础功能
implementation "androidx.lifecycle:lifecycle-runtime:2.5.1"
//Lifecycle Kotlin扩展功能
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"

在第三方地图集成业务中,都会要求MapView在项目中使用地图的时候需要注意,需要合理的管理地图生命周期,这非常的重要,以下是高德地图官方集成示例,当有多个Activity持有MapView对象时,维护难度增加

public class MainActivity extends Activity {
  MapView mMapView = null;
  @Override
  protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main);
    //获取地图控件引用
    mMapView = (MapView) findViewById(R.id.map);
    //在activity执行onCreate时执行mMapView.onCreate(savedInstanceState),创建地图
    mMapView.onCreate(savedInstanceState);
  }
  @Override
  protected void onDestroy() {
    super.onDestroy();
    //在activity执行onDestroy时执行mMapView.onDestroy(),销毁地图
    mMapView.onDestroy();
  }
 @Override
 protected void onResume() {
    super.onResume();
    //在activity执行onResume时执行mMapView.onResume (),重新绘制加载地图
    mMapView.onResume();
    }
 @Override
 protected void onPause() {
    super.onPause();
    //在activity执行onPause时执行mMapView.onPause (),暂停地图的绘制
    mMapView.onPause();
    }
 @Override
 protected void onSaveInstanceState(Bundle outState) {
    super.onSaveInstanceState(outState);
    //在activity执行onSaveInstanceState时执行mMapView.onSaveInstanceState (outState),保存地图当前的状态
    mMapView.onSaveInstanceState(outState);
  } 
}

使用Lifecycle简化代码结构,可以组件生命周期相关业务处理集成功能组件内部,宿主Activity不必再参与功能组件生命周期处理

class CustomAMap:LifecycleEventObserver {
    private lateinit var aMapView: MapView
    
    override fun initMap(mapView: View) {
        aMapView = mapView as MapView
    }
    
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when (event) {
            Lifecycle.Event.ON_CREATE -> {
                aMapView.onCreate(null)
            }
            Lifecycle.Event.ON_RESUME -> {
                aMapView.onResume()
            }
            Lifecycle.Event.ON_PAUSE -> {
                aMapView.onPause()
            }
            Lifecycle.Event.ON_DESTROY -> {
                aMapView.onDestroy()
             
            }else ->{

            }
        }
    }
    
class AMapActivity : AppCompatActivity() {
    private lateinit var mAMap: CustomAMap
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityAmapBinding.inflate(layoutInflater)
        setContentView(binding.root)
        mAMap = CustomAMap()
        lifecycle.addObserver(mAMap)
        mAMap.initMap(binding.map)
    }
}

Lifecycle原理分析

LifecycleOwner

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

ComponentActivity 实现该接口,并将其注册成Lifecycle的子类LifecycleRegistry

public class ComponentActivity extends androidx.core.app.ComponentActivity implements
        ......
        LifecycleOwner,
        .....
{
    private final LifecycleRegistry mLifecycleRegistry = new LifecycleRegistry(this);
    
    //父类接口指向子类对象
    //封装隐藏了类的内部实现机制,可以在不影响使用者的前提下修改类的内部结构,同时保护了数据
    @Override
    public Lifecycle getLifecycle() {
        return mLifecycleRegistry;
    }
}

Lifecycle

Lifecycle是抽象类,对外暴露三个接口方法addObserver、removeObserver、getCurrentState
串联LifecycleObserver、LifecycleOwner

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

    @SuppressWarnings("WeakerAccess")
    public enum Event {
        ON_CREATE,
        ON_START,
        ON_RESUME,
        ON_PAUSE,
        ON_STOP,
        ON_DESTROY,
        ON_ANY;
        
        @Nullable
        public static Event downFrom(@NonNull State state) {
            switch (state) {
                case CREATED:
                    return ON_DESTROY;
                case STARTED:
                    return ON_STOP;
                case RESUMED:
                    return ON_PAUSE;
                default:
                    return null;
            }
        }

        @Nullable
        public static Event downTo(@NonNull State state) {
            switch (state) {
                case DESTROYED:
                    return ON_DESTROY;
                case CREATED:
                    return ON_STOP;
                case STARTED:
                    return ON_PAUSE;
                default:
                    return null;
            }
        }

        @Nullable
        public static Event upFrom(@NonNull State state) {
            switch (state) {
                case INITIALIZED:
                    return ON_CREATE;
                case CREATED:
                    return ON_START;
                case STARTED:
                    return ON_RESUME;
                default:
                    return null;
            }
        }

        @Nullable
        public static Event upTo(@NonNull State state) {
            switch (state) {
                case CREATED:
                    return ON_CREATE;
                case STARTED:
                    return ON_START;
                case RESUMED:
                    return ON_RESUME;
                default:
                    return null;
            }
        }
        
        @NonNull
        public State getTargetState() {
            switch (this) {
                case ON_CREATE:
                case ON_STOP:
                    return State.CREATED;
                case ON_START:
                case ON_PAUSE:
                    return State.STARTED;
                case ON_RESUME:
                    return State.RESUMED;
                case ON_DESTROY:
                    return State.DESTROYED;
                case ON_ANY:
                    break;
            }
            throw new IllegalArgumentException(this + " has no target state");
        }
    }

    @SuppressWarnings("WeakerAccess")
    public enum State {
        DESTROYED,
        INITIALIZED,
        CREATED,
        STARTED,
        RESUMED;
        
        public boolean isAtLeast(@NonNull State state) {
            return compareTo(state) >= 0;
        }
    }
}

LifecycleRegistry

LifecycleRegistry 是Lifecycle具体实现类,ComponentActivity持有该对象,addOberser执行到该对象中,内部持有mObserverMap对象,记录所有LifecycleObserver

public class LifecycleRegistry extends Lifecycle {

    //管理所有的生命周期观察者,用于后续生命事件分发
    private FastSafeIterableMap<LifecycleObserver, ObserverWithState> mObserverMap =
            new FastSafeIterableMap<>();
    
    //当前LifecycleOwner状态
    private State mState;
    
    //弱引用封装,避免内存泄漏
    private final WeakReference<LifecycleOwner> mLifecycleOwner;
    
    /**
    * 添加观察者,将观察者与初始化状态封装成ObserverWithState,将当前LifecycleOwner最新状态
    * 同步分发给最新的观察者
    **/
    @Override
    public void addObserver(@NonNull LifecycleObserver observer) {
        enforceMainThreadIfNeeded("addObserver");
        //初始化状态两种DESTROYED、INITIALIZED
        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;
        }
        
        //同步最新的Event事件
        boolean isReentrance = mAddingObserverCounter != 0 || mHandlingEvent;
        
        //计算最新的生命周期状态,通过比较mObserver最新的状态、与mParentStates最新状态进行比较
        State targetState = calculateTargetState(observer);
        mAddingObserverCounter++;
        while ((statefulObserver.mState.compareTo(targetState) < 0
                && mObserverMap.contains(observer))) {
            pushParentState(statefulObserver.mState);
            final Event event = Event.upFrom(statefulObserver.mState);
            if (event == null) {
                throw new IllegalStateException("no event up from " + statefulObserver.mState);
            }
            statefulObserver.dispatchEvent(lifecycleOwner, event);
            popParentState();
            // mState / subling may have been changed recalculate
            targetState = calculateTargetState(observer);
        }

        if (!isReentrance) {
            // we do sync only on the top level.
            sync();
        }
        mAddingObserverCounter--;
    }
    
    
    
    
    /**
    * 封装一个持有Lifecycle状态Observer,并将持有生命周期Event事件分发
    * Lifecycling 理解为不同观察者适配器,将所有的观察者转为LifecycleEventObserver,分发时再
    * 根据具体的子类实现调用不用的方法
    **/
    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;
        }
    }
    
    //在FragmentActivity中该方法
    public void handleLifecycleEvent(@NonNull Lifecycle.Event event) {
        enforceMainThreadIfNeeded("handleLifecycleEvent");
        moveToState(event.getTargetState());
    }

    private void moveToState(State next) {
        if (mState == next) {
            return;
        }
        if (mState == INITIALIZED && next == DESTROYED) {
            throw new IllegalStateException("no event down from " + mState);
        }
        mState = next;
        if (mHandlingEvent || mAddingObserverCounter != 0) {
            mNewEventOccurred = true;
            // we will figure out what to do on upper level.
            return;
        }
        mHandlingEvent = true;
        //同步最新的状态
        sync();
        mHandlingEvent = false;
        if (mState == DESTROYED) {
            mObserverMap = new FastSafeIterableMap<>();
        }
    }
    ......
}

LifecycleObserver

生命周期观察者接口,有两个子类实现LifecycleEventObserver、FullLifecycleObserver

public interface LifecycleObserver {

}
public interface LifecycleEventObserver extends LifecycleObserver {
    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);
}

Lifecycling

LifecycleEventObserver、FullLifecycleObserver两种观察者适配器,同时包括通过注解形式调用方法的具体实现

public class Lifecycling {

    @NonNull
    @SuppressWarnings("deprecation")
    static LifecycleEventObserver lifecycleEventObserver(Object object) {
        ......
        boolean isLifecycleEventObserver = object instanceof LifecycleEventObserver;
        boolean isFullLifecycleObserver = object instanceof FullLifecycleObserver;
        //通过FullLifecycleObserverAdapter对生命周期回调进行适配
        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);
    }
    ......
}

生命周期监听注解使用方式,官方已废弃该种方式,无法获取LifecycleOwner

class CustomAMap : IMap, LifecycleObserver {

    @OnLifecycleEvent(Lifecycle.Event.ON_START) 
    private fun onCreate(){ }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    private fun onStart(){

    }
    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    private fun onResume(){

    }
    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    private fun onPause(){

    }
    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    private fun onStop(){

    }
    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    private fun onDestroy(){

    }
}

Lifecycle实践案例

在 Android 应用中,通常请求网络数据源以便在屏幕上显示数据更新。通过收集这些数据流,来避免产生不必要的操作和资源浪费 (包括 CPU 和内存),以及防止在 View 进入后台时泄露数据

lifecycleScope

//引用协程依赖
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-core:1.6.1'
implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.6.1'
//Lifecycle Kotlin扩展功能
implementation "androidx.lifecycle:lifecycle-runtime-ktx:2.5.1"
class AMapActivity : AppCompatActivity() {
    companion object {
        private const val TAG = "AMapActivity"
    }
    
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        binding = ActivityAmapBinding.inflate(layoutInflater)
        setContentView(binding.root)
        binding.map.onCreate(savedInstanceState)
        aMap = CustomAMap()
        lifecycle.addObserver(aMap)
        
        //使用lifecycleScope作用域启动协程,关于协程相关后续文章中补充
        lifecycleScope.launch {
            withContext(Dispatchers.IO){

            }
            //在生命周期大于START状态时执行该方法
            lifecycle.repeatOnLifecycle(Lifecycle.State.STARTED){
            
            }
        }
        lifecycleScope.launch(Dispatchers.IO){

        }
        lifecycleScope.launchWhenCreated {
            
        }
        
}

参考Google开发者推文使用更为安全的方式收集 Android UI 数据流 - 简书 (jianshu.com)

ProcessLifecycleOwner

需要添加gradle依赖,可以实现对整个App生命周期监测,监听App前后台切换

implementation "androidx.lifecycle:lifecycle-process:2.4.1"
class App:Application() {

    companion object{
        private final val TAG = "App"

        val isForeground
            get() = ProcessLifecycleOwner.get().lifecycle.currentState.isAtLeast(Lifecycle.State.STARTED)
    }

    private val processLifecycleObserver by lazy {
        object : DefaultLifecycleObserver{
            override fun onStart(owner: LifecycleOwner) {
                super.onStart(owner)
                Log.d(TAG, "进入前台")
            }
            override fun onStop(owner: LifecycleOwner) {
                super.onStart(owner)
                Log.d(TAG, "进入后台")
            }
        }
    }

    override fun onCreate() {
        super.onCreate()
        ProcessLifecycleOwner.get().lifecycle.addObserver(processLifecycleObserver)
    }
}

LifecycleService

拥有生命周期概念的组件,除了Activity和Fragment,还有一个非常重要的组件是Service,Android提供了一个名为LifecycleService的类,让该类继承自Service,并实现LifecycleOwner接口
同时当Service拥有了Lifecycle生命周期后就可以使用LifecycleScope启动协程处理耗时任务

class CustomService:LifecycleService() {
    companion object{
        private const val TAG = "CustomService"
    }

    override fun onCreate() {
        super.onCreate()
        Log.d(TAG,"onCreate")
        lifecycle.addObserver(CustomLifecycleServiceObserver())
        lifecycleScope.launch {
            //todo
        }
    }

    override fun onBind(intent: Intent): IBinder? {
        Log.d(TAG,"onBind")
        return super.onBind(intent)
    }
}

class CustomLifecycleServiceObserver: LifecycleEventObserver{
    override fun onStateChanged(source: LifecycleOwner, event: Lifecycle.Event) {
        when(event){
            Lifecycle.Event.ON_START->{
                Log.d("CustomLifecycleServiceObserver","ON_START")
            }
            Lifecycle.Event.ON_STOP->{
                Log.d("CustomLifecycleServiceObserver","ON_STOP")
            }
            else->{}
        }
    }
}