今天,简单讲讲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; @Override public void onActivityCreated(Activity activity, Bundle savedInstanceState) { } @Override public void onActivityStarted(Activity activity) { activityStartCount++; //数值从0变到1说明是从后台切到前台 if (activityStartCount == 1){ //从后台切到前台 if(mOnAppStatusListener != null){ mOnAppStatusListener.onFront(); } } } @Override public void onActivityResumed(Activity activity) { } @Override public void onActivityPaused(Activity activity) { } @Override public void onActivityStopped(Activity activity) { activityStartCount--; //数值从1到0说明是从前台切到后台 if (activityStartCount == 0){ //从前台切到后台 if(mOnAppStatusListener != null){ mOnAppStatusListener.onBack(); } } } @Override public void onActivitySaveInstanceState(Activity activity, Bundle outState) { } @Override public void onActivityDestroyed(Activity activity) { } }; public interface OnAppStatusListener{ void onFront(); void onBack(); } }
二、Application中使用(注意:仅在Application中才能使用,因为Application的生命周期能监听到每个Activity)
public class MyApp extends Application { @Override public void onCreate() { super.onCreate(); AppFrontBackHelper helper = new AppFrontBackHelper(); helper.register(MyApp.this, new AppFrontBackHelper.OnAppStatusListener() { @Override public void onFront() { //应用切到前台处理 } @Override public 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 如何监听应用前后台切换就讲完了。
就这么简单。