我们这里主要是分析Lifecycle的两个组件,他们是
1 | implementation "androidx.lifecycle:lifecycle-process:$lifecycle_version" |
lifecycle-process
是用来感知整个应用的生命周期,比如我们要知道当前引用处于前台还是后台。lifecycle-service
是用来感知Service的生命周期的。
ActivityLifecycleCallbacks
在讲解使用他们之前,我们先看一个类ActivityLifecycleCallbacks
,他是Application
内部定义的一个接口,定义了Activity执行时候的生命周期,我们可以通过((Application) context.getApplicationContext()).registerActivityLifecycleCallbacks();
来监听所有的Activity的生命周期。与我们的LifeCycle不太一样,他是系统层级去进行调用和通知的,他是可以起到类似LifecycleRegistry的作用,但是他是针对所有的Activity,而我们的LifecycleRegistry是针对单个Activity的。我们看下ActivityLifecycleCallbacks
有那些方法。
1 | public interface ActivityLifecycleCallbacks { |
可以看到看到关于Activity的生命周期的通知回调都是抽象方法,还有两种pre
和post
默认方法。其中pre
就是在对应的生命周期执行之前执行,post
则是在对应生命周期执行之后执行。比如我们的Activity执行了onCreate
,那么ActivityLifecycleCallbacks则会执行onActivityCreated
,而在Activity执行onCreate
之前,先会执行ActivityLifecycleCallbacks的onActivityPreCreated
,在执行完了onCreate
到onActivityCreated
之后,会再去执行onActivityPostCreated
,其他的也类似。需要注意的是pre
和post
方法是需要Android10只会才会被调用的。同样的,对于Build.VERSION.SDK_INT >= 29
以上的。
Activity也提供了registerActivityLifecycleCallbacks
方法,假如在Activity里面注册,则是只针对当前的Activity,他可以收到一次onActivityCreated
和一次onActivityDestroyed
,其他生命周期可以收到多次。
lifecycle-process
我们的分析的源码版本是2.2.0
。新版本的lifecycle-process
组件已经不需要我们手动初始化了,他是会在ProcessLifecycleOwnerInitializer
这个ContentProvider
的onCreate
去初始化(该方法是介于Application的attachBaseContext
到onCreate
之间的)。
1 | @Override |
LifecycleDispatcher
的作用是给每个Activity注入ReportFragment
,可以看到他往Application里面注册了一个ActivityLifecycleCallbacks
1 | static class DispatcherActivityCallback extends EmptyActivityLifecycleCallbacks { |
然后我们再看ProcessLifecycleOwner
,Lifecycle.Event.ON_CREATE
只有在他的attach
里面调用了,后续都没有调用,而且整个过程也没有调用Lifecycle.Event.ON_DESTROY
,所以对于ProcessLifecycleOwner
,注册到它的LifecycleObserver只会调用一次onCreate
,同时不会调用onDestroy
。
我们可以看到对于Build.VERSION.SDK_INT < 29
一下的,会使用ReportFragment
,给他注入一个ActivityInitializationListener
,ReportFragment
中会在对应的生命周期调用ActivityInitializationListener
的方法。而对于Build.VERSION.SDK_INT >= 29
的,则是注册了一个ActivityLifecycleCallbacks
,然后在onActivityPreCreated
中,给每个Activity再去注册ActivityLifecycleCallbacks
。
所以其实他的activityResumed
和activityStarted
都只会在一个地方调用,要么是在ActivityInitializationListener
(API<29),要么是在Activity注册的ActivityLifecycleCallbacks
调用。
然后我们再看他的成员变量
- mStartedCounter,Activity执行start的次数,每执行一次增加1,每执行一次stop减1
- mResumedCounter,Activity执行resume的次数,每执行一次增加1,每执行一次pause减1
- mStopSent,Activity是否发送过stop,默认true
- mPauseSent,Activity是否发送过pause,默认true
在通知注册在ProcessLifecycleOwner
的LifecycleObserver的时候,他是这样的其他的方法也是类似的,我们就不说了,我们说下实际中怎么使用1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23void activityStarted() {
mStartedCounter++;
if (mStartedCounter == 1 && mStopSent) {
//等于1而且是stop过的才会通知LifecycleObserver,而且只会通知一次,因为mStopSent执行之后设置为了false
mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_START);
mStopSent = false;
}
}
void activityResumed() {
mResumedCounter++;
if (mResumedCounter == 1) {
//只有一个Act执行过onResume的时候才会进入
if (mPauseSent) {
//需要执行过pause才会通知LifecycleObserver
mRegistry.handleLifecycleEvent(Lifecycle.Event.ON_RESUME);
mPauseSent = false;
} else {
//假如没有执行过pause则把mDelayedPauseRunnable移除
mHandler.removeCallbacks(mDelayedPauseRunnable);
}
}
}应用启动,或者是从后台到前台的时候,只会调用一次1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58class AppLife implements LifecycleObserver {
//可以继承LifecycleEventObserver或者是FullLifecycleObserver也可以,不用注解
private static final String TAG = "AppLife";
/**
* ON_CREATE 在应用程序的整个生命周期中只会被调用一次
*/
@OnLifecycleEvent(Lifecycle.Event.ON_CREATE)
public void onCreate() {
Log.d(TAG, "Lifecycle.Event.ON_CREATE");
}
/**
* 应用程序出现到前台时调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_START)
public void onStart() {
Log.d(TAG, "Lifecycle.Event.ON_START");
}
/**
* 应用程序出现到前台时调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_RESUME)
public void onResume() {
Log.d(TAG, "Lifecycle.Event.ON_RESUME");
}
/**
* 应用程序退出到后台时调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_PAUSE)
public void onPause() {
Log.d(TAG, "Lifecycle.Event.ON_PAUSE");
}
/**
* 应用程序退出到后台时调用
*/
@OnLifecycleEvent(Lifecycle.Event.ON_STOP)
public void onStop() {
Log.d(TAG, "Lifecycle.Event.ON_STOP");
}
/**
* 永远不会被调用到,系统不会分发调用ON_DESTROY事件
*/
@OnLifecycleEvent(Lifecycle.Event.ON_DESTROY)
public void onDestroy() {
Log.d(TAG, "Lifecycle.Event.ON_DESTROY");
}
}
//然后在自定义的Application中
@Override
public void onCreate() {
super.onCreate();
ProcessLifecycleOwner.get().getLifecycle().addObserver(new AppLife());
}onStart
和onResume
,应用推至后台的时候,则会执行一次onPause
和onStop
,我们可以选择一组进行判断使用。假如我们需要判断应用是处于前台还是后台,可以增加一个布尔变量,早onResume
设置为true,在onStop
设置为false。这样外部可以读取这个变量既可判断。
lifecycle-service
它的源码也比较的简单,就不多说了,它主要是提供了一个LifecycleService
,我们的服务需要继承它,然后我们定义一个LifecycleObserver,通过它的getLifecycle()方法,
添加到该Service的Lifecycle
中。当Service被启动,被暂停,被重新Start
都可以接受到回调。与Activity中注入LifecycleObserver差不多,注意Service的只有ON_CREATE
,ON_START
,ON_STOP
,ON_DESTROY
。其中ON_STOP
,ON_DESTROY
会被一起调用,这里就不举例子了。