前段时间需要做一个功能,就是判断手机中本APP是否处于前台,如果处于前台就执行一个操作.参考了网上其他大神写的一些方法,发现一些漏洞和bug,表达一下自己观点.
这是github通用的判断处于前台的六种方法:https://github.com/wenmingvs/AndroidProcess
方法1:RunningTask判断
话不多说直接上代码
public static boolean getRunningTask(Context context, String packageName) {
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
ComponentName cn = am.getRunningTasks(1).get(0).topActivity;
return !TextUtils.isEmpty(packageName) && packageName.equals(cn.getPackageName());
}
此方法说的是5.0以后失效但是可以判断自己应用,5.0之前通用,用过测试过发现,这个方法是检测栈顶的存在Activity,(别如说我打开应用了,这个是微信来了一条消息,打开微信,这时此方法判断结果为在前台存活,
可是我想要结果是在后台)。
结论:分特定情况,不准确.
方法2:RunningProcess判断
/**
* 方法2:通过getRunningAppProcesses的IMPORTANCE_FOREGROUND属性判断是否位于前台,当service需要常驻后台时候,此方法失效,
* 在小米 Note上此方法无效,在Nexus上正常
*
* @param context 上下文参数
* @param packageName 需要检查是否位于栈顶的App的包名
* @return
*/
public static boolean getRunningAppProcesses(Context context, String packageName) {
ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningAppProcessInfo> appProcesses = activityManager.getRunningAppProcesses();
if (appProcesses == null) {
return false;
}
for (ActivityManager.RunningAppProcessInfo appProcess : appProcesses) {
if (appProcess.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND && appProcess.processName.equals(packageName)) {
return true;
}
}
return false;
}
结论:比如存在服务是不准。
方法3:ActivityLifecycleCallbacks监听实现
/**存活Activity数量(写在你的Util就行)**/
public static boolean getApplicationValue(MyApplication myApplication) {
return myApplication.getAppCount() > 0;
}
写在Application之中,别忘记清单文件注册。
private int appCount = 0;
ActivityLifecycleCallbacks activityLifecycleCallbacks=new ActivityLifecycleCallbacks() {
@Override
public void onActivityCreated(Activity activity, Bundle savedInstanceState) {
}
@Override
public void onActivityStarted(Activity activity) {
appCount++;
}
@Override
public void onActivityResumed(Activity activity) {
}
@Override
public void onActivityPaused(Activity activity) {
}
@Override
public void onActivityStopped(Activity activity) {
appCount--;
}
@Override
public void onActivitySaveInstanceState(Activity activity, Bundle outState) {
}
@Override
public void onActivityDestroyed(Activity activity) {
}
}
@Override
public void onCreate() {
super.onCreate();
registerActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
public int getAppCount() {
return appCount;
}
@Override
public void onTerminate() {
super.onTerminate();
unregisterActivityLifecycleCallbacks(activityLifecycleCallbacks);
}
- AndroidSDK14在Application类里增加了ActivityLifecycleCallbacks
- 结论:代码最少,没有测出任何问题
方法4:UsageStatsManager监听实现
结论:需要授权,不适用,我也没测,直接弃用
方法5:通过Android无障碍功能实现
结论:需要授权,不适用,我也没测,直接弃用
方法6:读取Linux系统内核保存在/proc目录下的process进程信息
国外一个大牛写的原项目地址: https://github.com/jaredrummler/AndroidProcesses
- Android 辅助功能(AccessibilityService) 为我们提供了一系列的事件回调,帮助我们指示一些用户界面的状态变化。 我们可以派生辅助功能类,进而对不同的 AccessibilityEvent 进行处理。 同样的,这个服务就可以用来判断当前的前台应用
存在bug:后台常驻失效,比如我开了一个服务在下载文件,这是我按返回键退出应用程序,没有杀死,利用此方法判断出来App仍在前台,(只要后台存在判断出来都不准确)