判断应用是否处于前台的六种方法优缺点?

前段时间需要做一个功能,就是判断手机中本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仍在前台,(只要后台存在判断出来都不准确)

参考github项目链接:详细代码https://github.com/wenmingvs/AndroidProcess
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值