Android Jetpack -- Lifecycles篇

时间:2022-03-05 18:13:56

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

 

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

 1 package com.example.lifecycle;
 2 
 3 import androidx.appcompat.app.AppCompatActivity;
 4 
 5 import android.os.Bundle;
 6 import android.util.Log;
 7 
 8 public class MainActivity extends AppCompatActivity {
 9 
10     String TAG = "myTag";
11 
12     @Override
13     protected void onCreate(Bundle savedInstanceState) {
14         super.onCreate(savedInstanceState);
15         setContentView(R.layout.activity_main);
16         Log.d(TAG, "onCreate: ");
17     }
18 
19     @Override
20     protected void onStart() {
21         super.onStart();
22         Log.d(TAG, "onStart: ");
23     }
24 
25     @Override
26     protected void onResume() {
27         super.onResume();
28         Log.d(TAG, "onResume: ");
29     }
30 
31     @Override
32     protected void onPause() {
33         super.onPause();
34         Log.d(TAG, "onPause: ");
35     }
36 
37     @Override
38     protected void onStop() {
39         super.onStop();
40         Log.d(TAG, "onStop: ");
41     }
42 
43     @Override
44     protected void onRestart() {
45         super.onRestart();
46         Log.d(TAG, "onRestart: ");
47     }
48 
49     @Override
50     protected void onDestroy() {
51         super.onDestroy();
52         Log.d(TAG, "onDestroy: ");
53     }
54 }

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

 

 

使用示例

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

 1 public class MyChronometer extends Chronometer implements LifecycleObserver {
 2     private long time;
 3     public MyChronometer(Context context) {
 4         super(context);
 5     }
 6 
 7     public MyChronometer(Context context, AttributeSet attrs) {
 8         super(context, attrs);
 9     }
10 
11     public MyChronometer(Context context, AttributeSet attrs, int defStyleAttr) {
12         super(context, attrs, defStyleAttr);
13     }
14 
15     //以注解的形式完成监听
16     @OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
17     private void stopMeter(){
18         time = SystemClock.elapsedRealtime() - getBase();
19         stop();
20     }
21 
22     @OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
23     private void resumeMeter(){
24         setBase(SystemClock.elapsedRealtime() - time);
25         start();
26     }
27 }

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

 1 public class LifecyclesActivity extends AppCompatActivity {
 2 
 3     MyChronometer chronometer;
 4 
 5     @Override
 6     protected void onCreate(Bundle savedInstanceState) {
 7         super.onCreate(savedInstanceState);
 8         setContentView(R.layout.activity_lifecycles);
 9 
10         chronometer = findViewById(R.id.meter);
11         getLifecycle().addObserver(chronometer);
12     }
13 
14 }

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