diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java
index a3488b6081..387aa9d64f 100644
--- a/utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java
+++ b/utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java
@@ -433,13 +433,13 @@ public static boolean isSystemApp(Context context, String packageName) {
* @return {@code true}: 是
{@code false}: 否
*/
public static boolean isAppForeground(Context context) {
- return isApplicationForeground(context, context.getPackageName());
+ return ProcessUtils.isAppForeground(context);
}
/**
- * 判断App是否处于前台
- *
需添加权限 {@code }
- * 该方法在 API 21 被遗弃,已经不能使用
+ * 判断某个App是否处于前台(系统应用调用)
+ * API <= 21,需要添加 {@code } 权限
+ * API >= 22,需要添加 {@code } 权限
*
* @param context 上下文
* @param packageName 包名
@@ -447,32 +447,19 @@ public static boolean isAppForeground(Context context) {
*/
@Deprecated
public static boolean isAppForeground(Context context, String packageName) {
- ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- @SuppressWarnings("deprecation")
- List tasks = am.getRunningTasks(1);
- return tasks != null && !tasks.isEmpty()
- && tasks.get(0).topActivity.getPackageName().equals(packageName);
+ return ProcessUtils.isAppForeground(context, packageName);;
}
/**
- * 判断 App 是否处于前台
+ * 获取前台应用包名(系统应用调用)
+ * API <= 21,需要添加 {@code } 权限
+ * API >= 22,需要添加 {@code } 权限
*
- * @param context 上下文
- * @param packageName 包名
- * @return {@code true}: 是
{@code false}: 否
+ * @param context 上下文
+ * @return 前台应用包名
*/
- public static boolean isApplicationForeground(final Context context, String packageName) {
- final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
- final List processInfos = am.getRunningAppProcesses();
- if (processInfos != null) {
- for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
- if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
- && Arrays.asList(processInfo.pkgList).contains(packageName)) {
- return true;
- }
- }
- }
- return false;
+ public String getForegroundApp(Context context) {
+ return ProcessUtils.getForegroundPackage(context);
}
/**
diff --git a/utilcode/src/main/java/com/blankj/utilcode/utils/ProcessUtils.java b/utilcode/src/main/java/com/blankj/utilcode/utils/ProcessUtils.java
new file mode 100644
index 0000000000..58e65ab09a
--- /dev/null
+++ b/utilcode/src/main/java/com/blankj/utilcode/utils/ProcessUtils.java
@@ -0,0 +1,180 @@
+package com.blankj.utilcode.utils;
+
+import android.annotation.TargetApi;
+import android.app.ActivityManager;
+import android.app.usage.UsageEvents;
+import android.app.usage.UsageStats;
+import android.app.usage.UsageStatsManager;
+import android.content.Context;
+import android.os.Build;
+import android.text.TextUtils;
+
+import java.util.Arrays;
+import java.util.Calendar;
+import java.util.Date;
+import java.util.List;
+
+/**
+ *
+ * author: onlylemi
+ * blog : https://github.com/onlylemi
+ * time : 2016/10/14
+ * desc : 前台进程信息获取相关
+ *
+ */
+public class ProcessUtils {
+
+ private static UsageStats recentStats;
+ private static String result;
+
+ private ProcessUtils() {
+ }
+
+ /**
+ * 判断应用是否处于前台
+ *
+ * @param context
+ * @return
+ */
+ public static boolean isAppForeground(Context context) {
+ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ List runningAppProcessInfos = manager.getRunningAppProcesses();
+ if (runningAppProcessInfos == null || runningAppProcessInfos.size() == 0) {
+ return false;
+ }
+ for (ActivityManager.RunningAppProcessInfo ra : runningAppProcessInfos) {
+ if (ra.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
+ && Arrays.asList(ra.pkgList).contains(context.getPackageName())) {
+ return true;
+ }
+ }
+ return false;
+ }
+
+ /**
+ * 判断某个应用是否处于前台(系统应用调用)
+ * API <= 21,需要添加 {@code } 权限
+ * API >= 22,需要添加 {@code } 权限
+ *
+ * @param context
+ * @param packageName
+ * @return
+ */
+ public static boolean isAppForeground(Context context, String packageName) {
+ return TextUtils.equals(packageName, getForegroundPackage(context));
+ }
+
+ /**
+ * 获取前台应用包名(系统应用调用)
+ * API <= 21,需要添加 {@code } 权限
+ * API >= 22,需要添加 {@code } 权限
+ *
+ * @param context
+ * @return
+ */
+ public static String getForegroundPackage(Context context) {
+ if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
+ return getForegroundPackage1(context);
+ } else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
+ return getForegroundPackage2(context);
+ } else {
+ return getForegroundPackage3(context);
+ }
+ }
+
+
+ /**
+ * 获取前台应用包名(API < 21,已被遗弃,不能使用)
+ * 需要添加 {@code } 权限
+ *
+ * @param context
+ * @return
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP)
+ private static String getForegroundPackage1(Context context) {
+ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ List runningTaskInfos = manager.getRunningTasks(1);
+ if (runningTaskInfos == null || runningTaskInfos.size() == 0
+ || runningTaskInfos.get(0) == null) {
+ return null;
+ }
+
+ return runningTaskInfos.get(0).topActivity.getPackageName();
+ }
+
+ /**
+ * 获取前台应用包名(在 API 22 开始仅可以获取自己的应用,其他应用位于前台时获取到为 null,但可以通过此方式判断自己的应用是否处于前台)
+ *
+ * @param context
+ * @return
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+ private static String getForegroundPackage2(Context context) {
+ ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
+ List runningAppProcessInfos = manager.getRunningAppProcesses();
+ if (runningAppProcessInfos == null || runningAppProcessInfos.size() == 0) {
+ return null;
+ }
+ for (ActivityManager.RunningAppProcessInfo ra : runningAppProcessInfos) {
+ if (ra.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
+ return ra.processName;
+ }
+ }
+ return null;
+ }
+
+ /**
+ * 获取前台应用包名(API >= 22)
+ * 需要添加 {@code } 权限
+ *
+ * @param context
+ * @return
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+ public static String getForegroundPackage3(Context context) {
+ UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
+
+ Calendar calendar = Calendar.getInstance();
+ calendar.setTime(new Date());
+ long endTime = calendar.getTimeInMillis();// 结束时间
+ calendar.add(Calendar.DAY_OF_MONTH, -1);// 时间间隔为一个月
+ long beginTime = calendar.getTimeInMillis();// 开始时间
+ // 获取一个月内的信息
+ List usageStatses = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY, beginTime, endTime);
+ if (usageStatses == null || usageStatses.size() == 0) {
+ return null;
+ }
+ for (UsageStats usageStats : usageStatses) {
+ if (recentStats == null || usageStats.getLastTimeUsed() > recentStats.getLastTimeUsed()) {
+ recentStats = usageStats;
+ }
+ }
+
+ return recentStats.getPackageName();
+ }
+
+ /**
+ * 获取前台应用包名(API >= 22)
+ * 需要添加 {@code } 权限
+ *
+ * @param context
+ * @return
+ */
+ @TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
+ private static String getForegroundPackage4(Context context) {
+ UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
+
+ long endTime = System.currentTimeMillis();
+ long beginTime = endTime - 10 * 1000;
+ UsageEvents.Event event = new UsageEvents.Event();
+ UsageEvents usageEvents = usageStatsManager.queryEvents(beginTime, endTime);
+ while (usageEvents.hasNextEvent()) {
+ usageEvents.getNextEvent(event);
+ if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
+ result = event.getPackageName();
+ }
+ }
+
+ return result;
+ }
+}
\ No newline at end of file