package com.mogo.utils; import android.annotation.TargetApi; import android.app.Activity; import android.app.Application; import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import android.os.Build; import android.os.Bundle; import java.util.ArrayList; import java.util.HashMap; public class ActivityLifecycleManager { private Application mApplication; /** * 当前出于 Start 状态的 Activity */ private ArrayList mStartedActivities = new ArrayList<>(); private ArrayList mAppStateListeners = new ArrayList<>(); /** * 当前存活的 Activity */ private HashMap mAliveActivities = new HashMap<>(); /** * App 是否出于前台 */ private volatile boolean mIsAppActive = false; private Activity mCurrentResumedActivity; /** * Home 键事件广播的接受器 */ private HomeKeyEventReceiver mHomeKeyEventReceiver; /** * Home 键事件监听者列表 */ private ArrayList mHomeKeyEventListeners = new ArrayList<>(); private DefActivityLifecycleCallbacks mInnerActivityListener = new DefActivityLifecycleCallbacks() { @Override public void onActivityStarted(Activity activity) { if (mStartedActivities.isEmpty()) { mIsAppActive = true; notifyAppStateChanged(AppStateListener.ACTIVE); } mStartedActivities.add(activity); ActivityTrace trace = mAliveActivities.get(activity); if (trace != null) { trace.startCnt++; } } @Override public void onActivityStopped(Activity activity) { mStartedActivities.remove(activity); if (mStartedActivities.isEmpty()) { mIsAppActive = false; notifyAppStateChanged(AppStateListener.INACTIVE); } ActivityTrace trace = mAliveActivities.get(activity); if (trace != null) { trace.stopCnt++; } } @Override public void onActivityResumed(Activity activity) { mCurrentResumedActivity = activity; ActivityTrace trace = mAliveActivities.get(activity); if (trace != null) { trace.resumeCnt++; } } @Override public void onActivityPaused(Activity activity) { ActivityTrace trace = mAliveActivities.get(activity); if (trace != null) { trace.pauseCnt++; } } @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { mAliveActivities.put(activity, new ActivityTrace(activity)); } @Override public void onActivityDestroyed(Activity activity) { mAliveActivities.remove(activity); } }; private ActivityLifecycleManager() { } public static ActivityLifecycleManager getInstance() { return SingletonHolder.INSTANCE; } private static class SingletonHolder { private static final ActivityLifecycleManager INSTANCE = new ActivityLifecycleManager(); } public void start(Application application) { this.mApplication = application; registerInnerActivityListener(); registerHomeKeyEventReceiver(); } public void stop() { unregisterActivityLifecycleCallbacks(mInnerActivityListener); unregisterHomeKeyEventReceiver(); } /** * 注册 Activity 生命周期的回调 * * @param callbacks Activity 生命周期的回调 */ public void registerActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callbacks) { if (mApplication == null) { return; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return; } mApplication.registerActivityLifecycleCallbacks(callbacks); } /** * 取消注册 Activity 生命周期的回调 * * @param callbacks Activity 生命周期的回调 */ public void unregisterActivityLifecycleCallbacks(Application.ActivityLifecycleCallbacks callbacks) { if (mApplication == null) { return; } if (Build.VERSION.SDK_INT < Build.VERSION_CODES.ICE_CREAM_SANDWICH) { return; } mApplication.unregisterActivityLifecycleCallbacks(callbacks); } /** * 应用是否出于前台 */ public boolean isAppActive() { return mIsAppActive; } public void setAppActive(boolean appActive) { mIsAppActive = appActive; } public Activity getCurrentActivity() { return mCurrentResumedActivity; } /** * 添加应用状态的监听 */ public void addAppStateListener(AppStateListener listener) { synchronized (mAppStateListeners) { mAppStateListeners.add(listener); } } /** * 移除应用状态的监听 * * @param listener */ public void removeAppStateListener(AppStateListener listener) { synchronized (mAppStateListeners) { mAppStateListeners.remove(listener); } } /** * 添加 home 键的事件监听 */ public void addHomeKeyEventListener(HomeKeyEventListener listener) { if (listener == null) { return; } synchronized (mHomeKeyEventListeners) { mHomeKeyEventListeners.add(listener); } } /** * 移除 home 键的事件监听 */ public void removeHomeKeyEventListener(HomeKeyEventListener listener) { if (listener == null) { return; } synchronized (mHomeKeyEventListeners) { mHomeKeyEventListeners.remove(listener); } } /** * 注册Activity生命周期的监听 */ private void registerInnerActivityListener() { registerActivityLifecycleCallbacks(mInnerActivityListener); } private void notifyAppStateChanged(int state) { Object[] listeners = collectAppStateListeners(); if (listeners != null) { for (int i = 0; i < listeners.length; i++) { ((AppStateListener) listeners[i]).onStateChanged(state); } } } private Object[] collectAppStateListeners() { Object[] listeners = null; synchronized (mAppStateListeners) { if (mAppStateListeners.size() > 0) { listeners = mAppStateListeners.toArray(); } } return listeners; } private Object[] collectHomeKeyEventListeners() { Object[] listeners = null; synchronized (mHomeKeyEventListeners) { if (mHomeKeyEventListeners.size() > 0) { listeners = mHomeKeyEventListeners.toArray(); } } return listeners; } private void registerHomeKeyEventReceiver() { android.content.IntentFilter filter = new android.content.IntentFilter(); filter.addAction(Intent.ACTION_CLOSE_SYSTEM_DIALOGS); mHomeKeyEventReceiver = new HomeKeyEventReceiver(); mApplication.registerReceiver(mHomeKeyEventReceiver, filter); } private void unregisterHomeKeyEventReceiver() { mApplication.unregisterReceiver(mHomeKeyEventReceiver); } private void onHomeKeyPressed() { Object[] listeners = collectHomeKeyEventListeners(); if (listeners != null) { for (int i = 0; i < listeners.length; i++) { ((HomeKeyEventListener) listeners[i]).onHomeKeyPressed(); } } } @TargetApi(Build.VERSION_CODES.ICE_CREAM_SANDWICH) public static abstract class DefActivityLifecycleCallbacks implements Application.ActivityLifecycleCallbacks { @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } } public interface AppStateListener { int INACTIVE = 0; int ACTIVE = 1; /** * App 状态的回调 */ void onStateChanged(int state); } /** * home 键的监听 */ public interface HomeKeyEventListener { void onHomeKeyPressed(); } /** * Activity 的生命周期调用痕迹 */ static class ActivityTrace { Activity activity; int resumeCnt; int pauseCnt; int startCnt; int stopCnt; ActivityTrace(Activity activity) { this.activity = activity; } } private final class HomeKeyEventReceiver extends BroadcastReceiver { private final String SYSTEM_DIALOG_REASON_KEY = "reason"; private final String SYSTEM_DIALOG_REASON_HOME_KEY = "homekey"; @Override public void onReceive(Context context, Intent intent) { String action = intent.getAction(); if (Intent.ACTION_CLOSE_SYSTEM_DIALOGS.equals(action)) { String reason = intent.getStringExtra(SYSTEM_DIALOG_REASON_KEY); if (reason != null && reason.equals(SYSTEM_DIALOG_REASON_HOME_KEY)) { onHomeKeyPressed(); } } } } }