@@ -83,22 +83,37 @@ public static Activity getActivityByContext(Context context) {
8383 }
8484
8585 private static Activity getActivityByContextInner (Context context ) {
86- if (context instanceof Activity ) return (Activity ) context ;
87- if (context != null && context .getClass ().getName ().equals ("com.android.internal.policy.DecorContext" )) {
88- try {
89- Field mActivityContextField = context .getClass ().getDeclaredField ("mActivityContext" );
90- mActivityContextField .setAccessible (true );
91- //noinspection unchecked
92- return ((WeakReference <Activity >) mActivityContextField .get (context )).get ();
93- } catch (Exception e ) {
94- e .printStackTrace ();
95- }
96- }
86+ if (context == null ) return null ;
87+ List <Context > list = new ArrayList <>();
9788 while (context instanceof ContextWrapper ) {
9889 if (context instanceof Activity ) {
9990 return (Activity ) context ;
10091 }
92+ Activity activity = getActivityFromDecorContext (context );
93+ if (activity != null ) return activity ;
94+ list .add (context );
10195 context = ((ContextWrapper ) context ).getBaseContext ();
96+ if (context == null ) {
97+ return null ;
98+ }
99+ if (list .contains (context )) {
100+ // loop context
101+ return null ;
102+ }
103+ }
104+ return null ;
105+ }
106+
107+ private static Activity getActivityFromDecorContext (Context context ) {
108+ if (context == null ) return null ;
109+ if (context .getClass ().getName ().equals ("com.android.internal.policy.DecorContext" )) {
110+ try {
111+ Field mActivityContextField = context .getClass ().getDeclaredField ("mActivityContext" );
112+ mActivityContextField .setAccessible (true );
113+ //noinspection ConstantConditions,unchecked
114+ return ((WeakReference <Activity >) mActivityContextField .get (context )).get ();
115+ } catch (Exception ignore ) {
116+ }
102117 }
103118 return null ;
104119 }
0 commit comments