美文网首页
Android架构组件-Lifecycles

Android架构组件-Lifecycles

作者: _九卿_ | 来源:发表于2018-07-11 12:04 被阅读98次
    添加依赖

    首先在工程根目录的build.gradle中添加一下内容:

    buildscript {
        ...
        ext.lifecycle_version = '1.1.1'
        ext.room_version = '1.1.1'
        ...
    }
    allprojects {
        repositories {
            jcenter()
            maven { url 'https://maven.google.com' }  //添加此行
        }
    }
    

    然后在应用目录下的build.gradle中添加以下依赖:

    //For Lifecycles, LiveData, and ViewModel
    implementation "android.arch.lifecycle:runtime:&lifecycle_version"
    compile "android.arch.lifecycle:extensions:&lifecycle_version"
    annotationProcessor "android.arch.lifecycle:compiler:&lifecycle_version"
    //alternately - if using Java8, use the following instead of compiler
    implementation "android.arch.lifecycle:common-java8:&lifecycle_version"
    //For Room
    compile "android.arch.persistence.room:runtime:1.0.0-alpha1"
    annotationProcessor "android.arch.persistence.room:compiler:1.0.0-alpha1"
    

    Lifecycle

    • LifeCyle类持有Activity或者Fragment的生命周期相关信息,并且支持其他对象监听这些状态。
    • LifeCyle有两个枚举用于追踪生命周期中的状态。

    Event
    这是生命周期的事件类,会在Framework和LifeCycle间传递,这些事件映射到Activity和Fragment的回调事件中。

    State
    LifeCycle所持有Activity或Fragment的当前状态。

    如图:


    生命周期
    LifeCycle相关使用

    从官网介绍的例子看,在没引进Lifecycle时,在处理Activity或者Fragment组件的生命周期相关时,不可避免会遇到这样的问题:
    在Activity的onCreate()中初始化某些成员(比如MVP架构中的Presenter,或者AudioManager、MediaPlayer、LocationListener等),然后在onStop中对这些成员进行对应处理,在onDestroy中释放这些资源,这样导致我们的代码也许会像这样:

    class MyLocationListener {
        public MyLocationListener(Context context, Callback callback) {
            // ...
        }
    
        void start() {
            // connect to system location service
        }
    
        void stop() {
            // disconnect from system location service
        }
    }
    
    
    class MyActivity extends AppCompatActivity {
        private MyLocationListener myLocationListener;
    
        public void onCreate(...) {
            myLocationListener = new MyLocationListener(this, location -> {
                // update UI
            });
        }
    
        @Override
        public void onStart() {
            super.onStart();
            Util.checkUserStatus(result -> {
                // what if this callback is invoked AFTER activity is stopped?
                if (result) {
                    myLocationListener.start();
                }
            });
        }
    
        @Override
        public void onStop() {
            super.onStop();
            myLocationListener.stop();
        }
    }
    

    虽然以上代码看起来很简洁,但在实际项目中的onStart,onStop方法可能会变得相当庞大。

    一个类想要监听LifeCycle的状态,只需要给其方法加上注解:

    /**
     * java 8.0之前  minsdkversion24之前可用,需要注释实现生命周期观察
     */
    interface IPresenterOld : LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
        fun onCreate(owner: LifecycleOwner)
    
        @OnLifecycleEvent(Lifecycle.Event.ON_START)
        fun onStart(owner: LifecycleOwner)
    
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        fun onResume(owner: LifecycleOwner)
    
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        fun onPause(owner: LifecycleOwner)
    
        @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
        fun onDestroy(owner: LifecycleOwner)
    }
    

    可以直接实现 DefaultLifecycleObserver 接口,必须用" implementation "android.arch.lifecycle:common-java8:1.1.1" ",另外 minsdkversion 要大于24

    interface IPresenter: DefaultLifecycleObserver {}
    

    我们查看下DefaultLifecycleObserver源码:

    package android.arch.lifecycle;
    
    import android.support.annotation.NonNull;
    
    @SuppressWarnings("unused")
    public interface DefaultLifecycleObserver extends FullLifecycleObserver {
    
        @Override
        default void onCreate(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onStart(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onResume(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onPause(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onStop(@NonNull LifecycleOwner owner) {
        }
    
        @Override
        default void onDestroy(@NonNull LifecycleOwner owner) {
        }
    }
    

    FullLifecycleObserver:

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

    从下图我们可以更清晰的了解Lifecycle与activity/fragment生命周期的关系


    Lifecycle时序图

    LifeCycleOwner是一个只有一个方法的接口用于表明其有一个LifeCycle对象。这个方法为getLifecycle()。
    这个对象给Acitivity,Fragment和LifeCycle提供了一个很好的抽象关系,Activity和Fragment只要实现这个接口就能配合LifeCycle实现生命周期监听。

    class LifeCyclesActivity : AppCompatActivity() {
        val TAG = "LifeCyclesActivity"
    
        lateinit var mPresenter: IPresenter
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            val binding: ActivityLifeCyclesBinding = DataBindingUtil.setContentView(this, R.layout.activity_life_cycles)
            mPresenter = MainPresenter(this)
            lifecycle.addObserver(mPresenter)
        }
    
        override fun onStart() {
            super.onStart()
            Log.d(TAG, "onStart: ")
        }
    
        override fun onResume() {
            super.onResume()
            Log.d(TAG, "onResume: ")
        }
    
        override fun onPause() {
            super.onPause()
            Log.d(TAG, "onPause: ")
        }
    
        override fun onStop() {
            super.onStop()
            Log.d(TAG, "onStop: ")
        }
    
        override fun onDestroy() {
            super.onDestroy()
            Log.d(TAG, "onDestroy: ")
        }
    }
    

    MainPresenter:

    class MainPresenter : IPresenter {
        val TAG = "MainPresenter"
    
        constructor(context: Context)
    
        override fun onCreate(owner: LifecycleOwner) {
            Log.d(TAG,  "onCreate: ")
        }
    
        override fun onStart(owner: LifecycleOwner) {
            Log.d(TAG,  "onStart: ")
        }
    
        override fun onResume(owner: LifecycleOwner) {
            Log.d(TAG,  "onResume: ")
        }
    
        override fun onPause(owner: LifecycleOwner) {
            Log.d(TAG,  "onPause: ")
        }
    
        override fun onDestroy(owner: LifecycleOwner) {
            Log.d(TAG,  "onDestroy: ")
        }
    }
    

    根据Log,我们可以清楚的看到MainPresenter的方法同activity的生命周期

    还可以对自定义的View添加生命周期的处理

            binding.testTextview.lifecycle = lifecycle
            lifecycle.addObserver(binding.testTextview)
    

    TestTextView,也继承了IPresenter

    class TestTextView : AppCompatTextView, IPresenter {
    
        var lifecycle: Lifecycle? = null
        var enable: Boolean = true
        lateinit var buffer: StringBuffer
    
        constructor(context: Context, attributeSet: AttributeSet) : super(context, attributeSet) {
            buffer = StringBuffer()
        }
    
        fun setLifecycleEnable(enable: Boolean) {
            this.enable = enable
            lifecycle?.apply {
                if(currentState.isAtLeast(Lifecycle.State.STARTED)){
    
                }
            }
        }
    
        override fun onCreate(owner: LifecycleOwner) {
            if (enable) {
                buffer.append(System.currentTimeMillis().toString() + "-onCreate\n")
                this.text = buffer
            }
        }
    
        override fun onResume(owner: LifecycleOwner) {
            if (enable) {
                buffer.append(System.currentTimeMillis().toString() + "-onResume\n")
                this.text = buffer
            }
        }
    
        override fun onPause(owner: LifecycleOwner) {
            if (enable) {
                buffer.append(System.currentTimeMillis().toString() + "-onPause\n")
                this.text = buffer
            }
        }
    }
    ···
    

    参考:

    相关文章

      网友评论

          本文标题:Android架构组件-Lifecycles

          本文链接:https://www.haomeiwen.com/subject/mdxhpftx.html