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