检查应用是在前台还是在后台进行通知

时间:2018-07-04 11:27:57

标签: java android

我需要检查应用程序是foreground还是background才能在任务栏或应用程序中显示传入的通知。目前,我已经使用RunningTaskInfo完成了此操作,但这需要获得android.permission.GET_TASKS的许可。任何帮助深表感谢!

我当前的检查方式

 public static boolean isAppIsInBackground(Context context) {
    boolean isInBackground = true;
    ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    if (Build.VERSION.SDK_INT > Build.VERSION_CODES.KITKAT_WATCH) {
        List<ActivityManager.RunningAppProcessInfo> runningProcesses = am.getRunningAppProcesses();
        for (ActivityManager.RunningAppProcessInfo processInfo : runningProcesses) {
            if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
                for (String activeProcess : processInfo.pkgList) {
                    if (activeProcess.equals(context.getPackageName())) {
                        isInBackground = false;
                    }
                }
            }
        }
    } else {
        List<ActivityManager.RunningTaskInfo> taskInfo = am.getRunningTasks(1);
        ComponentName componentInfo = taskInfo.get(0).topActivity;
        if (componentInfo.getPackageName().equals(context.getPackageName())) {
            isInBackground = false;
        }
    }

    return isInBackground;
}

编辑-解决方案

所以这是我最终要解决的问题。感谢/ u / Dima Kozhevin向我指出正确的帖子。这是帖子:How to detect when an Android app goes to the background and come back to the foreground,我最后做了一些修改。我添加的代码是检查屏幕是否打开。我是通过以下方式完成的:

@Override
public void onActivityPaused(Activity activity) {
    PowerManager pm = (PowerManager) activity.getSystemService(Context.POWER_SERVICE);
    if (!isInBackground) {
        if (!pm.isScreenOn()) {
            isInBackground = true;
            Log.e(TAG, "app went to background");
        }
    }
}

我在3种不同的设备上运行了该解决方案,这些设备最终都可以工作。如果有人发现任何东西最终破坏了这一点,请告诉我!

1 个答案:

答案 0 :(得分:0)

我当前正在使用此代码来检查我的应用程序是否正在运行。它在这里完美工作。只需复制/粘贴以下代码:

public static boolean isAppRunning(final Context context) {
    final ActivityManager activityManager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
    final List<ActivityManager.RunningAppProcessInfo> procInfos = activityManager.getRunningAppProcesses();
    if (procInfos != null) {
        for (final ActivityManager.RunningAppProcessInfo processInfo : procInfos) {
            if (processInfo.processName.equals(BuildConfig.APPLICATION_ID)) {
                return true;
            }
        }
    }
    return false;
}

我在这里做什么? 我正在搜索所有活动的应用程序进程,并检查是否有与我的应用程序名称相同的 Name 进程。请注意,进程名称是程序包名称,因此可以正常进行检查。试试吧。