Android監聽APP前後臺轉換的兩種方式
阿新 • • 發佈:2019-02-17
應用場景:很多時候我們需要去監聽使用者有沒有將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回撥,來看程式碼實現
這樣基本上實現了app前後臺切換的動態監聽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) { } }); } }