android 如何监听应用前后台切换
今天,簡單講講android如何判斷應用切換到后臺和應用切換到前臺。
這個其實很簡單,之前需要做一個功能,當app由后臺進入前臺時需要完成一些邏輯操作,所以在網上查找如何判斷app由后臺進入前臺,最終是解決了問題。這里記錄一下。
一.使用ActivityLifecycleCallbacks簡單app進入后臺
有時需要監聽到應用在前后臺切換并做些處理,一般的做法可能是建立一個BaseActivity,然后全部的Activity都繼承它,在BaseActivity的onStart和onStop中計數去處理。這樣并不是最好的方式,不做詳細介紹,有更好的方式,道理其實差不多,就是借助ActivityLifecycleCallbacks來實現。
一、寫了個幫助類:
package com.dway.helper;import android.app.Activity; import android.app.Application; import android.os.Bundle;/*** 應用前后臺狀態監聽幫助類,僅在Application中使用* Created by dway on 2018/1/30.*/public class AppFrontBackHelper {private OnAppStatusListener mOnAppStatusListener;public AppFrontBackHelper() {}/*** 注冊狀態監聽,僅在Application中使用* @param application* @param listener*/public void register(Application application, OnAppStatusListener listener){mOnAppStatusListener = listener;application.registerActivityLifecycleCallbacks(activityLifecycleCallbacks);}public void unRegister(Application application){application.unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);}private Application.ActivityLifecycleCallbacks activityLifecycleCallbacks = new Application.ActivityLifecycleCallbacks() {//打開的Activity數量統計private int activityStartCount = 0;@Overridepublic void onActivityCreated(Activity activity, Bundle savedInstanceState) {}@Overridepublic void onActivityStarted(Activity activity) {activityStartCount++;//數值從0變到1說明是從后臺切到前臺if (activityStartCount == 1){//從后臺切到前臺if(mOnAppStatusListener != null){mOnAppStatusListener.onFront();}}}@Overridepublic void onActivityResumed(Activity activity) {}@Overridepublic void onActivityPaused(Activity activity) {}@Overridepublic void onActivityStopped(Activity activity) {activityStartCount--;//數值從1到0說明是從前臺切到后臺if (activityStartCount == 0){//從前臺切到后臺if(mOnAppStatusListener != null){mOnAppStatusListener.onBack();}}}@Overridepublic void onActivitySaveInstanceState(Activity activity, Bundle outState) {}@Overridepublic void onActivityDestroyed(Activity activity) {}};public interface OnAppStatusListener{void onFront();void onBack();}}
二、Application中使用(注意:僅在Application中才能使用,因為Application的生命周期能監聽到每個Activity)
public class MyApp extends Application {@Overridepublic void onCreate() {super.onCreate();AppFrontBackHelper helper = new AppFrontBackHelper();helper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() {@Overridepublic void onFront() {//應用切到前臺處理}@Overridepublic void onBack() {//應用切到后臺處理}});}}
這里簡單講講,其實就是使Application注冊ActivityLifecycleCallbacks,這樣,當app里每一個activity的生命周期發生時,Application都能監聽到。根據activity的public?void?onActivityStarted(Activity?activity)?和public?void?onActivityStopped(Activity?activity)的次數來判斷app是否處于前臺。因為當app處于前臺時,必定有一個activity執行了onActivityStarted而沒有執行onActivityStopped,所以app內打開的Activity數量統計必定為1,當app切換到后臺時,activityStartCount?就會為0.
二.直接判斷app是否在后臺。
/*** 判斷應用是否是在后臺*/public static boolean isBackground(Context context) {ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);KeyguardManager keyguardManager = (KeyguardManager) context.getSystemService(KEYGUARD_SERVICE);List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {if (TextUtils.equals(appProcess.processName, context.getPackageName())) {boolean isBackground = (appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.importance != ActivityManager.RunningAppProcessInfo.IMPORTANCE_VISIBLE);boolean isLockedState = keyguardManager.inKeyguardRestrictedInputMode();return isBackground || isLockedState;}}return false;}上面這個方法通過監測應用進程是否處于前臺狀態,是否可見,手機是否鎖屏來判斷應用是否處于前臺,如果這些情況有任一條達成的話就表明應用沒有處于前臺狀態,這個方法在大部分測試機上都沒有發現異常,但是我卻在原生的 Nexus 5 手機上發現當當棧中的Activiy只有一個 Activity的時候,例如:應用啟動,SplashActivity啟動LoginActivity后,關閉SplashActivity,此時棧中就只生剩下了LoginActivity,此時,無論是點擊返回鍵退出、點擊 Home 鍵退到后臺甚至點擊右側的多進程按鍵,此時的appProcess.importance 的都為 ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND,這樣就徹底宣告了判斷 appProcess.importance方法的失敗。
在網上看到有這種代碼判斷app是否處于后臺,所以提一下。簡單講講,這個判斷在部分手機上時有問題的,只是判斷app進程是否在后臺而已,所以簡單大家使用第一種代碼。
android 如何監聽應用前后臺切換就講完了。
就這么簡單。
總結
以上是生活随笔為你收集整理的android 如何监听应用前后台切换的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android 如何拖动控件的实现
- 下一篇: android 解决getNetwork