-
Notifications
You must be signed in to change notification settings - Fork 14
/
Copy pathProcessUtils.java
176 lines (159 loc) · 6.65 KB
/
ProcessUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
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;
/**
* ProcessUtils
*
* @author onlylemi
* @time 2016-10-14 09:05
*/
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<ActivityManager.RunningAppProcessInfo> 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;
}
/**
* 判断某个应用是否处于前台(系统应用调用)
* <p>API <= 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
*
* @param context
* @param packageName
* @return
*/
public static boolean isAppForeground(Context context, String packageName) {
return TextUtils.equals(packageName, getForegroundPackage(context));
}
/**
* 获取前台应用包名(系统应用调用)
* <p>API <= 21,需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
* <p>API >= 22,需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
*
* @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,已被遗弃,不能使用)
* <p>需要添加 {@code <uses-permission android:name="android.permission.GET_TASKS"/>} 权限</p>
*
* @param context
* @return
*/
@TargetApi(Build.VERSION_CODES.LOLLIPOP)
private static String getForegroundPackage1(Context context) {
ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
List<ActivityManager.RunningTaskInfo> 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<ActivityManager.RunningAppProcessInfo> 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)
* <p>需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
*
* @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<UsageStats> 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)
* <p>需要添加 {@code <uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"/>} 权限</p>
*
* @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;
}
}