Skip to content

Commit 5e0ec0a

Browse files
committed
判断App是否在前台,获取前台App的包名(仅支持系统App),同时对不同版本做兼容
1 parent 20a85e6 commit 5e0ec0a

File tree

2 files changed

+192
-25
lines changed

2 files changed

+192
-25
lines changed

utilcode/src/main/java/com/blankj/utilcode/utils/AppUtils.java

Lines changed: 12 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -433,46 +433,33 @@ public static boolean isSystemApp(Context context, String packageName) {
433433
* @return {@code true}: 是<br>{@code false}: 否
434434
*/
435435
public static boolean isAppForeground(Context context) {
436-
return isApplicationForeground(context, context.getPackageName());
436+
return ProcessUtils.isAppForeground(context);
437437
}
438438

439439
/**
440-
* 判断App是否处于前台
441-
* <p>需添加权限 {@code <uses-permission android:name="android.permission.GET_TASKS"/>}</p>
442-
* <p>该方法在 API 21 被遗弃,已经不能使用</p>
440+
* 判断某个App是否处于前台(系统应用调用)
441+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
442+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
443443
*
444444
* @param context 上下文
445445
* @param packageName 包名
446446
* @return {@code true}: 是<br>{@code false}: 否
447447
*/
448448
@Deprecated
449449
public static boolean isAppForeground(Context context, String packageName) {
450-
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
451-
@SuppressWarnings("deprecation")
452-
List<ActivityManager.RunningTaskInfo> tasks = am.getRunningTasks(1);
453-
return tasks != null && !tasks.isEmpty()
454-
&& tasks.get(0).topActivity.getPackageName().equals(packageName);
450+
return ProcessUtils.isAppForeground(context, packageName);;
455451
}
456452

457453
/**
458-
* 判断 App 是否处于前台
454+
* 获取前台应用包名(系统应用调用)
455+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
456+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
459457
*
460-
* @param context 上下文
461-
* @param packageName 包名
462-
* @return {@code true}: 是<br>{@code false}: 否
458+
* @param context 上下文
459+
* @return 前台应用包名
463460
*/
464-
public static boolean isApplicationForeground(final Context context, String packageName) {
465-
final ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
466-
final List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
467-
if (processInfos != null) {
468-
for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
469-
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
470-
&& Arrays.asList(processInfo.pkgList).contains(packageName)) {
471-
return true;
472-
}
473-
}
474-
}
475-
return false;
461+
public String getForegroundApp(Context context) {
462+
return ProcessUtils.getForegroundPackage(context);
476463
}
477464

478465
/**
Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
package com.blankj.utilcode.utils;
2+
3+
import android.annotation.TargetApi;
4+
import android.app.ActivityManager;
5+
import android.app.usage.UsageEvents;
6+
import android.app.usage.UsageStats;
7+
import android.app.usage.UsageStatsManager;
8+
import android.content.Context;
9+
import android.os.Build;
10+
import android.text.TextUtils;
11+
12+
import java.util.Arrays;
13+
import java.util.Calendar;
14+
import java.util.Date;
15+
import java.util.List;
16+
17+
/**
18+
* <pre>
19+
* author: onlylemi
20+
* blog : https://github.com/onlylemi
21+
* time : 2016/10/14
22+
* desc : 前台进程信息获取相关
23+
* </pre>
24+
*/
25+
public class ProcessUtils {
26+
27+
private static UsageStats recentStats;
28+
private static String result;
29+
30+
private ProcessUtils() {
31+
}
32+
33+
/**
34+
* 判断应用是否处于前台
35+
*
36+
* @param context
37+
* @return
38+
*/
39+
public static boolean isAppForeground(Context context) {
40+
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
41+
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = manager.getRunningAppProcesses();
42+
if (runningAppProcessInfos == null || runningAppProcessInfos.size() == 0) {
43+
return false;
44+
}
45+
for (ActivityManager.RunningAppProcessInfo ra : runningAppProcessInfos) {
46+
if (ra.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
47+
&& Arrays.asList(ra.pkgList).contains(context.getPackageName())) {
48+
return true;
49+
}
50+
}
51+
return false;
52+
}
53+
54+
/**
55+
* 判断某个应用是否处于前台(系统应用调用)
56+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
57+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
58+
*
59+
* @param context
60+
* @param packageName
61+
* @return
62+
*/
63+
public static boolean isAppForeground(Context context, String packageName) {
64+
return TextUtils.equals(packageName, getForegroundPackage(context));
65+
}
66+
67+
/**
68+
* 获取前台应用包名(系统应用调用)
69+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
70+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
71+
*
72+
* @param context
73+
* @return
74+
*/
75+
public static String getForegroundPackage(Context context) {
76+
if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP) {
77+
return getForegroundPackage1(context);
78+
} else if (Build.VERSION.SDK_INT < Build.VERSION_CODES.LOLLIPOP_MR1) {
79+
return getForegroundPackage2(context);
80+
} else {
81+
return getForegroundPackage3(context);
82+
}
83+
}
84+
85+
86+
/**
87+
* 获取前台应用包名(API < 21,已被遗弃,不能使用)
88+
* <p>需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
89+
*
90+
* @param context
91+
* @return
92+
*/
93+
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
94+
private static String getForegroundPackage1(Context context) {
95+
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
96+
List<ActivityManager.RunningTaskInfo> runningTaskInfos = manager.getRunningTasks(1);
97+
if (runningTaskInfos == null || runningTaskInfos.size() == 0
98+
|| runningTaskInfos.get(0) == null) {
99+
return null;
100+
}
101+
102+
return runningTaskInfos.get(0).topActivity.getPackageName();
103+
}
104+
105+
/**
106+
* 获取前台应用包名(在 API 22 开始仅可以获取自己的应用,其他应用位于前台时获取到为 null,但可以通过此方式判断自己的应用是否处于前台)
107+
*
108+
* @param context
109+
* @return
110+
*/
111+
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
112+
private static String getForegroundPackage2(Context context) {
113+
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
114+
List<ActivityManager.RunningAppProcessInfo> runningAppProcessInfos = manager.getRunningAppProcesses();
115+
if (runningAppProcessInfos == null || runningAppProcessInfos.size() == 0) {
116+
return null;
117+
}
118+
for (ActivityManager.RunningAppProcessInfo ra : runningAppProcessInfos) {
119+
if (ra.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND) {
120+
return ra.processName;
121+
}
122+
}
123+
return null;
124+
}
125+
126+
/**
127+
* 获取前台应用包名(API >= 22)
128+
* <p>需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
129+
*
130+
* @param context
131+
* @return
132+
*/
133+
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
134+
public static String getForegroundPackage3(Context context) {
135+
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
136+
137+
Calendar calendar = Calendar.getInstance();
138+
calendar.setTime(new Date());
139+
long endTime = calendar.getTimeInMillis();// 结束时间
140+
calendar.add(Calendar.DAY_OF_MONTH, -1);// 时间间隔为一个月
141+
long beginTime = calendar.getTimeInMillis();// 开始时间
142+
// 获取一个月内的信息
143+
List<UsageStats> usageStatses = usageStatsManager.queryUsageStats(UsageStatsManager.INTERVAL_MONTHLY, beginTime, endTime);
144+
if (usageStatses == null || usageStatses.size() == 0) {
145+
return null;
146+
}
147+
for (UsageStats usageStats : usageStatses) {
148+
if (recentStats == null || usageStats.getLastTimeUsed() > recentStats.getLastTimeUsed()) {
149+
recentStats = usageStats;
150+
}
151+
}
152+
153+
return recentStats.getPackageName();
154+
}
155+
156+
/**
157+
* 获取前台应用包名(API >= 22)
158+
* <p>需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
159+
*
160+
* @param context
161+
* @return
162+
*/
163+
@TargetApi(Build.VERSION_CODES.LOLLIPOP_MR1)
164+
private static String getForegroundPackage4(Context context) {
165+
UsageStatsManager usageStatsManager = (UsageStatsManager) context.getSystemService(Context.USAGE_STATS_SERVICE);
166+
167+
long endTime = System.currentTimeMillis();
168+
long beginTime = endTime - 10 * 1000;
169+
UsageEvents.Event event = new UsageEvents.Event();
170+
UsageEvents usageEvents = usageStatsManager.queryEvents(beginTime, endTime);
171+
while (usageEvents.hasNextEvent()) {
172+
usageEvents.getNextEvent(event);
173+
if (event.getEventType() == UsageEvents.Event.MOVE_TO_FOREGROUND) {
174+
result = event.getPackageName();
175+
}
176+
}
177+
178+
return result;
179+
}
180+
}

0 commit comments

Comments
 (0)