今天闲来无事,查看源码,发现一个有意思的接口Application.ActivityLifecycleCallbacks
| 12
 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源码
| 12
 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等其他生命周期函数)是干嘛的:
| 12
 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的处理过程。
这也是一个妙用。
希望对大家有用。