欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Jetpack之Lifecycle(一)Lifecycle简介及使用方法

程序员文章站 2022-06-07 18:18:45
...

1、为什么需要Lifecycle

在 Android 框架中定义的大多数应用组件都存在生命周期。生命周期由操作系统或进程中运行的框架代码管理。它们是 Android 运作方式的核心,应用必须遵循它们。如果不这样做,可能会引发内存泄露甚至应用崩溃。那么我们在开发中如果想自己监听activity的声明周期,可能会需要这样写:

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;

        @Override
        public void onCreate(...) {
            myLocationListener = new MyLocationListener(this, (location) -> {
                // update UI
            });
        }

        @Override
        public void onStart() {
            super.onStart();
            myLocationListener.start();
            // manage other components that need to respond
            // to the activity lifecycle
        }

        @Override
        public void onStop() {
            super.onStop();
            myLocationListener.stop();
            // manage other components that need to respond
            // to the activity lifecycle
        }
    }

虽然此示例看起来没问题,但在真实的应用中,最终会有太多管理界面和其他组件的调用,以响应生命周期的当前状态。管理多个组件会在生命周期方法(如 onStart() 和 onStop())中放置大量的代码,这使得它们难以维护。

此外,无法保证组件会在 Activity 或 Fragment 停止之前启动。在我们需要执行长时间运行的操作(如 onStart() 中的某种配置检查)时尤其如此。这可能会导致出现一种竞争条件,在这种条件下,onStop() 方法会在 onStart() 之前结束,这使得组件留存的时间比所需的时间要长。

2、什么是Lifecycle

Lifecycle 是一个类,用于存储有关组件(如 Activity 或 Fragment)的生命周期状态的信息,并允许其他对象观察此状态。

Lifecycle 使用两种主要枚举跟踪其关联组件的生命周期状态:
Event
从框架和 Lifecycle 类分派的生命周期事件。这些事件映射到 Activity 和 Fragment 中的回调事件。
State
由 Lifecycle 对象跟踪的组件的当前状态。
Jetpack之Lifecycle(一)Lifecycle简介及使用方法

3、Lifecycle使用方法

3.1在相应的moudle目录下的build.gradle中添加以下依赖:

dependencies {
    //...
    def lifecycle_version = "1.1.1"
    implementation "android.arch.lifecycle:runtime:$lifecycle_version"
}

3.2 实现LifecycleObserver接口

public class MyLifecycle implements LifecycleObserver {
    private static final String TAG = "MyLifecycle";

    @OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
    public void onCreate() {
        Log.d(TAG, "onCreate: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_START)
    public void onStart() {
        Log.d(TAG, "onStart: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
    public void onResume() {
        Log.d(TAG, "onResume: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
    public void onPause() {
        Log.d(TAG, "onPause: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_STOP)
    public void onStop() {
        Log.d(TAG, "onStop: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
    public void onDestroy() {
        Log.d(TAG, "onDestroy: ");
    }

    @OnLifecycleEvent(Lifecycle.Event.ON_ANY)
    public void onAny() {
        Log.d(TAG, "onAny: ");
    }
}

通过实现LifecycleObserver接口,然后在相应的方法上面添加注解@OnLifecycleEvent(Lifecycle.Event.XXX)即可。实际上,这就是一个观察者。当执行到某个生命周期时,会通知观察者执行对应的方法。

3.3 Activity中添加观察者

public class TestActivity extends AppCompatActivity {
    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.test_activity);
        getLifecycle().addObserver(new MyLifecycle());
    }
}

继承AppCompatActivity后,即可通过添加观察者来监听此Activity的生命周期了。相比第2小节的例子,只要一句话就完事,是不是简单多了呢。到这里,Lifecycle的简单使用例子就完成了。

我们来看下一个完整的生命周期的输出结果:

2020-04-16 16:28:02.976 12162-12162/com.gc.loading D/MyLifecycle: onCreate: 
2020-04-16 16:28:02.976 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:02.978 12162-12162/com.gc.loading D/MyLifecycle: onStart: 
2020-04-16 16:28:02.978 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:02.981 12162-12162/com.gc.loading D/MyLifecycle: onResume: 
2020-04-16 16:28:02.982 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.152 12162-12162/com.gc.loading D/MyLifecycle: onPause: 
2020-04-16 16:28:06.152 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.513 12162-12162/com.gc.loading D/MyLifecycle: onStop: 
2020-04-16 16:28:06.513 12162-12162/com.gc.loading D/MyLifecycle: onAny: 
2020-04-16 16:28:06.514 12162-12162/com.gc.loading D/MyLifecycle: onDestroy: 
2020-04-16 16:28:06.514 12162-12162/com.gc.loading D/MyLifecycle: onAny: 

相关标签: 架构 android