|
1 | 1 | package com.blankj.utilcode.util;
|
2 | 2 |
|
| 3 | +import android.annotation.SuppressLint; |
3 | 4 | import android.app.Activity;
|
4 | 5 | import android.content.ComponentName;
|
5 | 6 | import android.content.Context;
|
|
16 | 17 | import android.support.v4.util.Pair;
|
17 | 18 | import android.view.View;
|
18 | 19 |
|
| 20 | +import java.lang.reflect.Field; |
| 21 | +import java.lang.reflect.InvocationTargetException; |
19 | 22 | import java.util.List;
|
| 23 | +import java.util.Map; |
20 | 24 |
|
21 | 25 | /**
|
22 | 26 | * <pre>
|
@@ -736,14 +740,44 @@ public static String getLauncherActivity(@NonNull final String pkg) {
|
736 | 740 | */
|
737 | 741 | public static Activity getTopActivity() {
|
738 | 742 | if (Utils.sTopActivityWeakRef != null) {
|
739 |
| - Activity activity = Utils.sTopActivityWeakRef.get(); |
| 743 | + final Activity activity = Utils.sTopActivityWeakRef.get(); |
740 | 744 | if (activity != null) {
|
741 | 745 | return activity;
|
742 | 746 | }
|
743 | 747 | }
|
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."); |
747 | 781 | }
|
748 | 782 |
|
749 | 783 | /**
|
|
0 commit comments