1
1
package com .blankj .utilcode .utils ;
2
2
3
+ import android .app .Activity ;
3
4
import android .content .Context ;
4
5
import android .content .Intent ;
5
6
import android .content .pm .PackageManager ;
6
7
import android .content .pm .ResolveInfo ;
8
+ import android .os .Build ;
7
9
import android .os .Bundle ;
10
+ import android .util .ArrayMap ;
8
11
12
+ import java .lang .reflect .Field ;
13
+ import java .util .HashMap ;
9
14
import java .util .List ;
15
+ import java .util .Map ;
10
16
11
17
/**
12
18
* <pre>
@@ -25,53 +31,50 @@ private ActivityUtils() {
25
31
/**
26
32
* 判断是否存在Activity
27
33
*
28
- * @param context 上下文
29
34
* @param packageName 包名
30
35
* @param className activity全路径类名
31
36
* @return {@code true}: 是<br>{@code false}: 否
32
37
*/
33
- public static boolean isActivityExists (Context context , String packageName , String className ) {
38
+ public static boolean isActivityExists (String packageName , String className ) {
34
39
Intent intent = new Intent ();
35
40
intent .setClassName (packageName , className );
36
- return !(context .getPackageManager ().resolveActivity (intent , 0 ) == null ||
37
- intent .resolveActivity (context .getPackageManager ()) == null ||
38
- context .getPackageManager ().queryIntentActivities (intent , 0 ).size () == 0 );
41
+ return !(Utils . getContext () .getPackageManager ().resolveActivity (intent , 0 ) == null ||
42
+ intent .resolveActivity (Utils . getContext () .getPackageManager ()) == null ||
43
+ Utils . getContext () .getPackageManager ().queryIntentActivities (intent , 0 ).size () == 0 );
39
44
}
40
45
41
46
/**
42
47
* 打开Activity
43
48
*
44
- * @param context 上下文
45
49
* @param packageName 包名
46
50
* @param className 全类名
47
51
*/
48
- public static void launchActivity (Context context , String packageName , String className ) {
49
- launchActivity (context , packageName , className , null );
52
+ public static void launchActivity (String packageName , String className ) {
53
+ launchActivity (packageName , className , null );
50
54
}
51
55
52
56
/**
53
57
* 打开Activity
54
58
*
55
- * @param context 上下文
56
59
* @param packageName 包名
57
60
* @param className 全类名
58
61
* @param bundle bundle
59
62
*/
60
- public static void launchActivity (Context context , String packageName , String className , Bundle bundle ) {
61
- context .startActivity (IntentUtils .getComponentIntent (packageName , className , bundle ));
63
+ public static void launchActivity (String packageName , String className , Bundle bundle ) {
64
+ Utils . getContext () .startActivity (IntentUtils .getComponentIntent (packageName , className , bundle ));
62
65
}
63
66
64
67
/**
65
68
* 获取launcher activity
66
69
*
67
- * @param context 上下文
68
70
* @param packageName 包名
69
71
* @return launcher activity
70
72
*/
71
- public static String getLauncherActivity (Context context , String packageName ) {
73
+ public static String getLauncherActivity (String packageName ) {
72
74
Intent intent = new Intent (Intent .ACTION_MAIN , null );
73
75
intent .addCategory (Intent .CATEGORY_LAUNCHER );
74
- PackageManager pm = context .getPackageManager ();
76
+ intent .addFlags (Intent .FLAG_ACTIVITY_NEW_TASK );
77
+ PackageManager pm = Utils .getContext ().getPackageManager ();
75
78
List <ResolveInfo > infos = pm .queryIntentActivities (intent , 0 );
76
79
for (ResolveInfo info : infos ) {
77
80
if (info .activityInfo .packageName .equals (packageName )) {
@@ -80,4 +83,38 @@ public static String getLauncherActivity(Context context, String packageName) {
80
83
}
81
84
return "no " + packageName ;
82
85
}
86
+
87
+
88
+ /**
89
+ * 获取栈顶Activity
90
+ *
91
+ * @return 栈顶Activity
92
+ */
93
+ public static Activity getTopActivity () {
94
+ try {
95
+ Class activityThreadClass = Class .forName ("android.app.ActivityThread" );
96
+ Object activityThread = activityThreadClass .getMethod ("currentActivityThread" ).invoke (null );
97
+ Field activitiesField = activityThreadClass .getDeclaredField ("mActivities" );
98
+ activitiesField .setAccessible (true );
99
+ Map activities = null ;
100
+ if (Build .VERSION .SDK_INT < Build .VERSION_CODES .KITKAT ) {
101
+ activities = (HashMap ) activitiesField .get (activityThread );
102
+ } else {
103
+ activities = (ArrayMap ) activitiesField .get (activityThread );
104
+ }
105
+ for (Object activityRecord : activities .values ()) {
106
+ Class activityRecordClass = activityRecord .getClass ();
107
+ Field pausedField = activityRecordClass .getDeclaredField ("paused" );
108
+ pausedField .setAccessible (true );
109
+ if (!pausedField .getBoolean (activityRecord )) {
110
+ Field activityField = activityRecordClass .getDeclaredField ("activity" );
111
+ activityField .setAccessible (true );
112
+ return (Activity ) activityField .get (activityRecord );
113
+ }
114
+ }
115
+ } catch (Exception e ) {
116
+ e .printStackTrace ();
117
+ }
118
+ return null ;
119
+ }
83
120
}
0 commit comments