我需要检查应用程序是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种不同的设备上运行了该解决方案,这些设备最终都可以工作。如果有人发现任何东西最终破坏了这一点,请告诉我!
答案 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 进程。请注意,进程名称是程序包名称,因此可以正常进行检查。试试吧。