Skip to content

Commit 4887446

Browse files
committed
see 03/07 log
1 parent 96b5101 commit 4887446

File tree

2 files changed

+39
-5
lines changed

2 files changed

+39
-5
lines changed

utilcode/src/main/java/com/blankj/utilcode/util/ActivityUtils.java

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
package com.blankj.utilcode.util;
22

3+
import android.annotation.SuppressLint;
34
import android.app.Activity;
45
import android.content.ComponentName;
56
import android.content.Context;
@@ -16,7 +17,10 @@
1617
import android.support.v4.util.Pair;
1718
import android.view.View;
1819

20+
import java.lang.reflect.Field;
21+
import java.lang.reflect.InvocationTargetException;
1922
import java.util.List;
23+
import java.util.Map;
2024

2125
/**
2226
* <pre>
@@ -736,14 +740,44 @@ public static String getLauncherActivity(@NonNull final String pkg) {
736740
*/
737741
public static Activity getTopActivity() {
738742
if (Utils.sTopActivityWeakRef != null) {
739-
Activity activity = Utils.sTopActivityWeakRef.get();
743+
final Activity activity = Utils.sTopActivityWeakRef.get();
740744
if (activity != null) {
741745
return activity;
742746
}
743747
}
744-
List<Activity> activities = Utils.sActivityList;
745-
int size = activities.size();
746-
return size > 0 ? activities.get(size - 1) : null;
748+
// using reflect to get top activity
749+
try {
750+
@SuppressLint("PrivateApi")
751+
Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
752+
Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
753+
Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
754+
activitiesField.setAccessible(true);
755+
Map activities = (Map) activitiesField.get(activityThread);
756+
if (activities == null) return null;
757+
for (Object activityRecord : activities.values()) {
758+
Class activityRecordClass = activityRecord.getClass();
759+
Field pausedField = activityRecordClass.getDeclaredField("paused");
760+
pausedField.setAccessible(true);
761+
if (!pausedField.getBoolean(activityRecord)) {
762+
Field activityField = activityRecordClass.getDeclaredField("activity");
763+
activityField.setAccessible(true);
764+
Activity topActivity = (Activity) activityField.get(activityRecord);
765+
Utils.setTopActivityWeakRef(topActivity);
766+
return topActivity;
767+
}
768+
}
769+
} catch (ClassNotFoundException e) {
770+
e.printStackTrace();
771+
} catch (IllegalAccessException e) {
772+
e.printStackTrace();
773+
} catch (InvocationTargetException e) {
774+
e.printStackTrace();
775+
} catch (NoSuchMethodException e) {
776+
e.printStackTrace();
777+
} catch (NoSuchFieldException e) {
778+
e.printStackTrace();
779+
}
780+
throw new NullPointerException("The top activity is null.");
747781
}
748782

749783
/**

utilcode/src/main/java/com/blankj/utilcode/util/Utils.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ public static Application getApp() {
102102
throw new NullPointerException("u should init first");
103103
}
104104

105-
private static void setTopActivityWeakRef(final Activity activity) {
105+
static void setTopActivityWeakRef(final Activity activity) {
106106
if (activity.getClass() == PermissionUtils.PermissionActivity.class) return;
107107
if (sTopActivityWeakRef == null || !activity.equals(sTopActivityWeakRef.get())) {
108108
sTopActivityWeakRef = new WeakReference<>(activity);

0 commit comments

Comments
 (0)