Android Lifecycle框架介绍

作者: leacode | 来源:发表于2018-08-23 16:41 被阅读33次

    概览

    本篇主要介绍有关于Lifecycle

    Lifecycle 是属于 Android Architecture Components 的一个组件, 而Android Architecture Components是属于Android Jetpack的一部分, 可以让组件自己管理生命周期的逻辑,避免每次调用时的繁琐步骤,用Lifecycle实现的组件可以实现生命周期的监听,数据变化的监听等功能。

    关于Android Architecture Components

    Android Architecture Components 主要包含以下的组件

    • Room (用于数据持久化)
    • Lifecycle-aware components (能感知生命周期的组件)
    • ViewModels (用于存储和UI关联的数据,不会随设备旋转销毁)
    • LiveData (用于监听数据变化)
    • Navigation (用于应用内导航,可视化)
    • Paging (用于分页加载数据)
    • WorkManager (可用于创建定时启动的异步任务)

    这些组件可以帮助开发者能用更少的代码更高效的开发应用。

    Lifecycle集成

    首先从怎么集成开始

    第一步:

    在build.gradle中增加google()的repo

    allprojects {
        repositories {
            jcenter()
            google()
        }
    }
    

    第二步:

    添加依赖

    Java

        // Lifecyle的版本,现在最新的是1.1.1
        def lifecycle_version = "1.1.1"
    
        // ViewModel 和 LiveData
        implementation "android.arch.lifecycle:extensions:$lifecycle_version"
        // 仅用 ViewModel
        implementation "android.arch.lifecycle:viewmodel:$lifecycle_version"
        // 仅用 LiveData
        implementation "android.arch.lifecycle:livedata:$lifecycle_version"
        //  仅仅支持Lifecycle, 不包含LifeModel和LiveData
        implementation "android.arch.lifecycle:runtime:$lifecycle_version"
    
        annotationProcessor "android.arch.lifecycle:compiler:$lifecycle_version"
        // 如果用的是java8使用以下的依赖
        implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
    
        // LiveData 的 ReactiveStreams插件
        implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
    
        // LiveData测试
        testImplementation "android.arch.core:core-testing:$lifecycle_version"
    
    

    Kotlin

        // Lifecyle的版本,现在最新的是1.1.1
        def lifecycle_version = "1.1.1"
    
        // ViewModel 和 LiveData
        implementation "android.arch.lifecycle:extensions:$lifecycle_version"
        // 仅用 ViewModel
        implementation "android.arch.lifecycle:viewmodel-ktx:$lifecycle_version" // use -ktx for Kotlin
        // alternatively - just LiveData
        implementation "android.arch.lifecycle:livedata:$lifecycle_version"
        //  仅仅支持Lifecycle, 不包含LifeModel和LiveData
        implementation "android.arch.lifecycle:runtime:$lifecycle_version"
    
        kapt "android.arch.lifecycle:compiler:$lifecycle_version"
        // 如果用的是java8使用以下的依赖
        implementation "android.arch.lifecycle:common-java8:$lifecycle_version"
    
        // LiveData 的 ReactiveStreams插件
        implementation "android.arch.lifecycle:reactivestreams:$lifecycle_version"
    
        // LiveData测试
        testImplementation "android.arch.core:core-testing:$lifecycle_version"
    
    

    为什么会引入Lifecycle

    举个🌰

    我们在应用中有使用地图跟踪用户的地理位置,地理位置的更新在一个listener里。

    于是就有了如下的代码:

    public void onStart() {
        super.onStart();
        myLocationListener.start();
    }
    
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
    }
    

    这样写并不会有问题,但是会有以下两个问题可能出现:

    1、如果在onStart里有一个较为耗时的block存在,在运行的过程中用户退出了程序,就会在这个block运行时提前退出Activity, 这个问题就很难被定位到。

    public void onStart() {
        super.onStart();
        // 一个较为耗时的检查用户状态的block
        Util.checkUserStatus(result -> {
            // what if this callback is invoked AFTER activity is stopped?
            if (result) {
                myLocationListener.start();
            }
        });
    }
    
    public void onStop() {
        super.onStop();
        myLocationListener.stop();
    }
    

    2、如果在一个Activity内有较多的linstener需要像上面的🌰一样在onStart和onStop中管理,就会造成这两个地方的代码变得多而难以维护,如果忘掉一两个也很难一下子看出来。

    怎么解决这个问题?

    如果组件能够感知到Activity或者Fragment的变化,那么就可以在组件内部追踪Activity或者Fragment的生命周期,将之前写在Activity或者Fragment里的代码写到组件的内部。

    要解决这个问题,我们首先来看看android.arch.lifecycle包中为我们提供了哪些弹药:

    Lifecycle类

    Lifecycle类持有组件的可监听的生命周期的状态,通过Event和State两个枚举来体现关联的生命周期的状态。

    Event包含ON_ANY, ON_CREATE, ON_DESTROY, ON_PAUSE, ON_RESUME, ON_START, ON_STOP 这些枚举值

    可以通过使用注解OnLifecycleEvent来定义某个方法会响应某种State状态,例如:

    public class MyObserver implements LifecycleObserver {
        @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
        public void connectListener() {
            ...
        }
    
        @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
        public void disconnectListener() {
            ...
        }
    }
    

    State包含CREATED, DESTROYED, INITIALIZED, RESUMED, STARTED 这些枚举值, 在实现了LifecycleOwner接口的类中可以通过以下代码获得当前的State:

    if (getLifecycle().getCurrentState().isAtLeast(Lifecycle.State.STARTED)) {
    
    }
    

    关于LifecycleOwner接口

    · Support Library 26.1.0之后的Fragments和Activity都已经继承了LifecycleOwner接口,如AppCompatActivity和Fragment都已经继承LifecycleOwner接口, 但是Activity类并没有实现这个接口,如果想要使用lifecycle的特性,可以自己手动即成LifecycleOwner接口:

    import android.app.Activity;
    import android.arch.lifecycle.Lifecycle;
    import android.arch.lifecycle.LifecycleOwner;
    import android.arch.lifecycle.LifecycleRegistry;
    import android.os.Bundle;
    import android.support.annotation.NonNull;
    import android.support.annotation.Nullable;
    
    public class CustomLifecycleActivity extends Activity implements LifecycleOwner {
    
        private LifecycleRegistry mLifecycleRegistry;
    
        @Override
        protected void onCreate(@Nullable Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            
            mLifecycleRegistry = new LifecycleRegistry(this);
            mLifecycleRegistry.markState(Lifecycle.State.CREATED);
        }
    
        @Override
        public void onStart() {
            super.onStart();
            mLifecycleRegistry.markState(Lifecycle.State.STARTED);
        }
    
        @NonNull
        @Override
        public Lifecycle getLifecycle() {
            return mLifecycleRegistry;
        }
    }
    

    Lifecycle的组件和使用场景

    • LiveData 假设你的应用需要应用在前台的时候在地图上更新精细坐标,而程序进入后台只需要更新大致的位置(频率、精度不高的位置),那么使用LiveData可以在位置变化的时候自动更新UI

    • 假设你在开发一款在线播放视频的应用, 需要程序在进入前台的时候立即开始获取数据,当程序完全启动后开始恢复之前的播放,也可以让程序进入后台或者销毁后停止获取视频流

    • 程序在前台时实时更新网络状态,进入后台马上停止监听

    • 进入后台立即停止动画,进入前台立即恢复动画

    总结

    1、 Support Library 26.1.0之后的Fragments和Activity都已经继承了LifecycleOwner接口, 所以可以直接获得当前的State, 当onSaveInstanceState()执行时就会更新Lifecycle的State.

    2、 通过实现LifecycleOwner接口可以将不支持Lifecycle的组件手动支持Lifecycle

    3、@OnLifecycleEvent 可以在继承了LifecycleObserver的Listener中的方法中通过注解的方式告诉Listner在哪个Event状态时去执行某个方法。

    4、通过Listener结合LifecycleObserver可以将Activity或者Fragment中的生命周期管理的代码写到Listener内部,避免了每次调用时重复写管理生命周期方法的繁琐步骤。

    相关文章

      网友评论

      • yemoumou:须晴日,看红装素裹,分外妖娆。-简书朋友你好,我是币圈一老友,我的写作方向是区块链和数字货币,初到简书,望多多关照。互粉互赞,已赞,期待您的回赞哦。-ښ؀

      本文标题:Android Lifecycle框架介绍

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