【Android】Jetpack之LifeCycle

前言

LifeCycle是Google于2017年I/O大会上推出的一个生命周期感知组件,一般用来响应Activity、Fragment等组件的生命周期变化,并将变化通知到已注册的观察者。有助于更好地组织代码,让代码逻辑符合生命周期规范,减少内存泄漏,增强稳定性。

引入

dependencies {
    ......
    implementation "android.arch.lifecycle:runtime:1.1.1"
    implementation "android.arch.lifecycle:extensions:1.1.1"
    // 如果你使用java8开发,可以添加这个依赖,里面只有一个类
    implementation "android.arch.lifecycle:common-java8:1.1.1"
}

例子

比如说我们有一个类,需要在onCreate中初始化,在onDestory中释放资源。他可能长这样

class Test{
    
    fun init(){
        //
    }
    
    fun destroy(){
        //
    }
    
    fun connect(){
        //
    }
    
    fun disconnect(){
        //
    }
    
}

那么,其在Activity中使用大概是这样子的。

class TestActivity():AppCompatActivity{
	private lateinit var mTest:Test
    
    override fun onCreate(savedInstanceState:Bundle?){
        super.onCreate(saveInstaceState)
        mTest = Test()
        mTest.create()
    }
    
   	override fun onStart(){
        super.onStart()
        mTest.connect()
   	}
   	
   	override fun onStop(){
        super.onStop()
        mTest.disconnect()
   	}
   	
   	override fun onDestory(){
        super.onDestory()
        mTest.destory()
   	}
    
}

想这样的写法数量少还好,但是一旦多了起来,就会让里面变得混乱且臃肿。而LifeCycle就是来解决此问题的。

用法

LifeCycle把相关的生命周期通过把相关组件(Activity / Fragment)的生命周期整合起来,并允许其他对象观察次状态,把相关方法从中分理出来。

首先得先确认Activity继承自SupportLibrary26.1.0以后的AppCompatActivity,否则可以自行实现LifecycleOwner接口。

比如像下面这样


class InfoActivity : Activity(),LifecycleOwner {

    private val lifecycleRegistry by lazy { LifecycleRegistry(this) }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_info)
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
        lifecycle.addObserver(TestLifeCycle()) 
    }

    override fun onDestroy() {
        super.onDestroy()
        lifecycleRegistry.handleLifecycleEvent(Lifecycle.Event.ON_CREATE)
    }

	// 还有其他的生命周期方法也重写下

    override fun getLifecycle(): Lifecycle = lifecycleRegistry

}

其中lifecycle.addObserver(TestLifeCycle())中,TestLifeCycle的代码如下。通过addObserver()方法,即可与生命周期进行绑定。

private class TestLifeCycle:LifecycleObserver{

        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun create(){
            System.out.println("onCreate")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun start(){
            System.out.println("onStart")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun resume(){
            System.out.println("onResume")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        fun pause(){
            System.out.println("onPause")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
        fun stop(){
            System.out.println("onStop")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun destroy(){
            System.out.println("onDestroy")
        }

        @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
        fun any(){
            System.out.println("onAny")
        }

    }

如果你使用Java8进行开发,则推荐使用以下写法,以下为Java代码

public class Java8Observer implements DefaultLifecycleObserver {
    private static final String TAG = Java8Observer.class.getSimpleName();

    @Override
    public void onCreate(@NonNull LifecycleOwner owner) { Log.d(TAG, "onCreate"); }

    @Override
    public void onStart(@NonNull LifecycleOwner owner) { Log.d(TAG, "onStart"); }

    @Override
    public void onResume(@NonNull LifecycleOwner owner) { Log.d(TAG, "onResume"); }

    @Override
    public void onPause(@NonNull LifecycleOwner owner) { Log.d(TAG, "onPause"); }

    @Override
    public void onStop(@NonNull LifecycleOwner owner) { Log.d(TAG, "onStop"); }

    @Override
    public void onDestroy(@NonNull LifecycleOwner owner) { Log.d(TAG, "onDestroy"); }
}

运行程序就能看到,当我们旋转屏幕、切换任务,也能看到日志随着生命周期的变化打印出来。

参考资料

Android-Lifecycle超能解析-生命周期的那些事儿 - XBaron

Handling Lifecycles with Lifecycle-Aware Components Part of Android Jetpack. - Android Developer