From 000d3c095e0e7c94e415fc376a6fd18eaf6d82dd Mon Sep 17 00:00:00 2001 From: onlylemi Date: Fri, 14 Oct 2016 16:41:33 +0800 Subject: [PATCH] =?UTF-8?q?=E8=8E=B7=E5=8F=96App=E6=98=AF=E5=90=A6?= =?UTF-8?q?=E5=9C=A8=E5=89=8D=E5=8F=B0=EF=BC=8C=E5=9C=A8=E5=89=8D=E5=8F=B0?= =?UTF-8?q?App=E7=9A=84=E5=8C=85=E5=90=8D=EF=BC=88=E4=BB=85=E6=94=AF?= =?UTF-8?q?=E6=8C=81=E7=B3=BB=E7=BB=9FApp=EF=BC=89=EF=BC=8C=E5=90=8C?= =?UTF-8?q?=E6=97=B6=E5=AF=B9=E4=B8=8D=E5=90=8C=E7=89=88=E6=9C=AC=E5=81=9A?= =?UTF-8?q?=E5=85=BC=E5=AE=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/blankj/utilcode/utils/AppUtils.java | 37 ++-- .../blankj/utilcode/utils/ProcessUtils.java | 180 ++++++++++++++++++ 2 files changed, 192 insertions(+), 25 deletions(-) create mode 100644 utilcode/src/main/java/com/blankj/utilcode/utils/ProcessUtils.java 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