Skip to content

Commit 03fba42

Browse files
authored
Merge pull request Blankj#62 from onlylemi/patch-2
see 10/15 log
2 parents 71c7499 + 1b99535 commit 03fba42

File tree

2 files changed

+207
-11
lines changed

2 files changed

+207
-11
lines changed

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

Lines changed: 27 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -427,17 +427,33 @@ public static String getAppSignatureSHA1(Context context, String packageName) {
427427
* @return {@code true}: 是<br>{@code false}: 否
428428
*/
429429
public static boolean isAppForeground(Context context) {
430-
ActivityManager am = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
431-
List<ActivityManager.RunningAppProcessInfo> processInfos = am.getRunningAppProcesses();
432-
if (processInfos != null) {
433-
for (ActivityManager.RunningAppProcessInfo processInfo : processInfos) {
434-
if (processInfo.importance == ActivityManager.RunningAppProcessInfo.IMPORTANCE_FOREGROUND
435-
&& Arrays.asList(processInfo.pkgList).contains(context.getPackageName())) {
436-
return true;
437-
}
438-
}
439-
}
440-
return false;
430+
return ProcessUtils.isAppForeground(context);
431+
}
432+
433+
/**
434+
* 判断某个App是否处于前台(系统应用调用)
435+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
436+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
437+
*
438+
* @param context 上下文
439+
* @param packageName 包名
440+
* @return {@code true}: 是<br>{@code false}: 否
441+
*/
442+
@Deprecated
443+
public static boolean isAppForeground(Context context, String packageName) {
444+
return ProcessUtils.isAppForeground(context, packageName);;
445+
}
446+
447+
/**
448+
* 获取前台应用包名(系统应用调用)
449+
* <p>API < 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
450+
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
451+
*
452+
* @param context 上下文
453+
* @return 前台应用包名
454+
*/
455+
public String getForegroundApp(Context context) {
456+
return ProcessUtils.getForegroundPackage(context);
441457
}
442458

443459
/**
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)