首页 > 技术文章 > Android Jetpack -- Lifecycles篇

best-hym 2020-01-28 11:14 原文

Lifecycles其实从名字看肯定是与生命周期相关,那它与生命周期又有什么联系?
先参考一下官方文档:
Lifecycles是一个生命周期感知组件,当Activity或者Fragment的生命周期发生改变的时会,Lifecycles也会做出相应的生命周期状态的改变,它保存关于组件生命周期状态的信息(比如活动或片段),并允许其他对象观察这种状态。
可以看出Lifecycles是一个组件,具有感知生命周期的功能,既然是个组件,那就说明可以嵌入到其他地方,比如VewModel便是其中之一。

 

当我们需要处理与生命周期相关的组件的时候,在没有Lifecycles提供的时候,需要设置各种回调,如下所示:

 package com.example.lifecycle;
 
 import androidx.appcompat.app.AppCompatActivity;
 
 import android.os.Bundle;
 import android.util.Log;

 public class MainActivity extends AppCompatActivity {
 
     String TAG = "myTag";
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_main);
         Log.d(TAG, "onCreate: ");
     }
 
     @Override
     protected void onStart() {
         super.onStart();
         Log.d(TAG, "onStart: ");
     }
 
     @Override
     protected void onResume() {
         super.onResume();
         Log.d(TAG, "onResume: ");
     }
 
     @Override
     protected void onPause() {
         super.onPause();
         Log.d(TAG, "onPause: ");
     }
 
     @Override
     protected void onStop() {
         super.onStop();
         Log.d(TAG, "onStop: ");
     }
 
     @Override
     protected void onRestart() {
         super.onRestart();
         Log.d(TAG, "onRestart: ");
     }
 
     @Override
     protected void onDestroy() {
         super.onDestroy();
         Log.d(TAG, "onDestroy: ");
     }
 }

当组件数目过多的时候,便会需要在生命周期回调中管理多个组件从而徒增代码量,使得项目难以维护,而且在生命周期中执行过多的耗时操作极易引起内存泄漏,而这些问题都可以通过Lifecycles来解决。

使用示例

以Chronometer为例子来示范生命周期监听

 public class MyChronometer extends Chronometer implements LifecycleObserver {
    private long time;
     public MyChronometer(Context context) {
         super(context);
     }
 
     public MyChronometer(Context context, AttributeSet attrs) {
         super(context, attrs);
     }
 
     public MyChronometer(Context context, AttributeSet attrs, int defStyleAttr) {
         super(context, attrs, defStyleAttr);
     }
 
     //以注解的形式完成监听
     @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
     private void stopMeter(){
         time = SystemClock.elapsedRealtime() - getBase();
         stop();
     }
 
     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
     private void resumeMeter(){
         setBase(SystemClock.elapsedRealtime() - time);
         start();
     }
 }

然后Activity只需要添加观察者即可

 public class LifecyclesActivity extends AppCompatActivity {
 
    MyChronometer chronometer;
 
     @Override
     protected void onCreate(Bundle savedInstanceState) {
         super.onCreate(savedInstanceState);
         setContentView(R.layout.activity_lifecycles);
 
         chronometer = findViewById(R.id.meter);
         getLifecycle().addObserver(chronometer);
     }
 }

这样就使得Activity与Chronometer之间解耦了,Chrononmeter自我实现了良好的封装,也方便了代码的移植。
这也就是使用Lifecycles所带来的好处。

推荐阅读