1. 程式人生 > >Android監聽APP前後臺轉換的兩種方式

Android監聽APP前後臺轉換的兩種方式

應用場景:很多時候我們需要去監聽使用者有沒有將APPs放置在後臺,比如常用的銀行類APP、音視訊播放類APP,那麼這些APP為什麼要去監聽應用程式在不在前臺?銀行當然是為了安全,必須保證一些資料的傳輸一定是在前臺,音視訊播放APP呢,是為了更好的使用者體驗,使用者按下home鍵切換到其他頁面,期望是想讓正在播放的電影暫停下來,而不是看不到視訊頁面而APP還在不停的播放,鑑於此種目的,我們需要做監聽APP前後臺應用。現在找到兩種方法來實現:

一:BaseActivity基類+ActivityManager.RunningAppProcessInfo

首先,建立所有activity的基類,專案中所有Activity去繼承BaseActivity,這樣就可以統一管理,BaseActivity當然會有各種生命週期,onResume()和onStop()中去判斷執行邏輯程式碼,也就是說進入一個Activity頁面 它的onResume肯定會執行,home鍵退出應用程式肯定會走onStop,邏輯虛擬碼綜上所述,下面來看程式碼

public class BaseActivity extends Activity {

    public static boolean isActive; //全域性變數

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_base);
    }

    @Override
    protected void onResume() {
        if (!isActive) {
            //app 從後臺喚醒,進入前臺
            isActive = true;
            Log.i("ACTIVITY", "程式從後臺喚醒");
        }
        super.onResume();
    }

    @Override
    protected void onStart() {
        super.onStart();
    }

    @Override
    protected void onPause() {
        super.onPause();
    }

    @Override
    protected void onStop() {
        if (!isAppOnForeground()) {
            //app 進入後臺
            isActive = false;//記錄當前已經進入後臺
            Log.i("ACTIVITY", "程式進入後臺");
        }
        super.onStop();
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
    }

    /**
     * APP是否處於前臺喚醒狀態
     *
     * @return
     */
    public boolean isAppOnForeground() {
        ActivityManager activityManager = (ActivityManager) getApplicationContext().getSystemService(Context.ACTIVITY_SERVICE);
        String packageName = getApplicationContext().getPackageName();
        List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager
                .getRunningAppProcesses();
        if (appProcesses == null)
            return false;

        for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
            // The name of the process that this object is associated with.
            if (appProcess.processName.equals(packageName)
                    && appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                return true;
            }
        }

        return false;
    }
}

二:Application中註冊宣告週期監聽回撥

首先,建立當前專案的Application去繼承系統的Application,在Application中實現onCreate()方法,方法中註冊reginsterActivitylifecycleCallBacks回撥,來看程式碼實現

public class TheApplication extends Application {

    private int mFinalCount;

    @Override
    public void onCreate() {
        super.onCreate();
        registerActivityLifecycleCallbacks(new ActivityLifecycleCallbacks() {
            @Override
            public void onActivityCreated(Activity activity, Bundle savedInstanceState) {

            }

            @Override
            public void onActivityStarted(Activity activity) {
                mFinalCount++;
                //如果mFinalCount ==1,說明是從後臺到前臺
                Log.e("onActivityStarted", mFinalCount +"");
                if (mFinalCount == 1){
                    //說明從後臺回到了前臺
                }
            }

            @Override
            public void onActivityResumed(Activity activity) {

            }

            @Override
            public void onActivityPaused(Activity activity) {

            }

            @Override
            public void onActivityStopped(Activity activity) {
                mFinalCount--;
                //如果mFinalCount ==0,說明是前臺到後臺
                Log.i("onActivityStopped", mFinalCount +"");
                if (mFinalCount == 0){
                    //說明從前臺回到了後臺
                }
            }

            @Override
            public void onActivitySaveInstanceState(Activity activity, Bundle outState) {

            }

            @Override
            public void onActivityDestroyed(Activity activity) {

            }
        });
    }
}
這樣基本上實現了app前後臺切換的動態監聽