今天闲来无事,查看源码,发现一个有意思的接口Application.ActivityLifecycleCallbacks

1
2
3
4
5
6
7
8
9
public interface ActivityLifecycleCallbacks {
void onActivityCreated(Activity activity, Bundle savedInstanceState);
void onActivityStarted(Activity activity);
void onActivityResumed(Activity activity);
void onActivityPaused(Activity activity);
void onActivityStopped(Activity activity);
void onActivitySaveInstanceState(Activity activity, Bundle outState);
void onActivityDestroyed(Activity activity);
}

这就让我想起一个以前经历过的事,要求怎么判断APP进入后台。
看你的招商银行客户端,进入后台(就是这个APP所有页面不可见)就会一个Notication提示APP在后台运行。那么问题来了,我们需要怎么样判断,这个APP进入后台?

其实很简单,就是为每个Activity都注册一个事件,有一个计数器来记录所有的Activity是可见的:当Acitivity在onResume时,计数器加一,当Activity在onStop时,计数器减一,当计数器为零就可以判断这个APP不在我们手机的可见页面内,也就是我们说的进入了后台。

怎么监听Activity的onResume和onStop,我记得以前我们是自己写了一个BaseActivity,里面有相关的生命周期的监听,所有的Activity都要继承BaseActivity。但是在Acitivity代码我们我们发现这几句:

Activity源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

protected void onCreate(@Nullable Bundle savedInstanceState) {

……
mFragments.dispatchCreate();
getApplication().dispatchActivityCreated(this, savedInstanceState);

……
}


protected void onStop() {
getApplication().dispatchActivityStopped(this);
}

……

在Application里我们也去看看这个dispatchActivity*****(Create、Start、Resume等其他生命周期函数)是干嘛的:

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

void dispatchActivityStopped(Activity activity) {
Object[] callbacks = collectActivityLifecycleCallbacks();
if (callbacks != null) {
for (int i=0; i<callbacks.length; i++) {
((ActivityLifecycleCallbacks)callbacks[i]).onActivityStopped(activity);
}
}
}

private Object[] collectActivityLifecycleCallbacks() {
Object[] callbacks = null;
synchronized (mActivityLifecycleCallbacks) {
if (mActivityLifecycleCallbacks.size() > 0) {
callbacks = mActivityLifecycleCallbacks.toArray();
}
}
return callbacks;

}

public void registerActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.add(callback);
}
}

public void unregisterActivityLifecycleCallbacks(ActivityLifecycleCallbacks callback) {
synchronized (mActivityLifecycleCallbacks) {
mActivityLifecycleCallbacks.remove(callback);
}
}



private ArrayList<ActivityLifecycleCallbacks> mActivityLifecycleCallbacks =
new ArrayList<ActivityLifecycleCallbacks>();

这就是说我们在Application放了一个监听器的数组ArrayList,当在activity生命周期有变化出发dispatchActivity*****时,这里面的监听器都可以监听到,所有我们就可以通过注册和注销注册来坚挺所有的Activity的处理过程。

这也是一个妙用。

希望对大家有用。