有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何获取当前顶级活动上下文

在我的静态方法(参数只有一个字符串)中,我想使用Dialog(new AlertDialog.Builder(mContext)),但Dialog需要一个活动上下文来构造。如果我不通过外部上下文参数,仅通过反射或其他方法,如何获取当前顶级活动的对象

public static Activity getActivity() {
    Class activityThreadClass = null;
    try {
        activityThreadClass = Class.forName("安卓.app.ActivityThread");
        Object activityThread = activityThreadClass.getMethod("currentActivityThread").invoke(null);
        Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
        activitiesField.setAccessible(true);
        Map activities = (Map) activitiesField.get(activityThread);
        for (Object activityRecord : activities.values()) {
            Class activityRecordClass = activityRecord.getClass();
            Field pausedField = activityRecordClass.getDeclaredField("paused");
            pausedField.setAccessible(true);
            if (!pausedField.getBoolean(activityRecord)) {
                Field activityField = activityRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                Activity activity = (Activity) activityField.get(activityRecord);
                return activity;
            }
        }
    } catch (ClassNotFoundException e) {
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        e.printStackTrace();
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    }
    return null;
}

我使用了这段代码,但当我在非活动类中调用此方法时,activities为空

还有别的办法吗?不能使用对话框,只要能弹出信息就可以被用户看到。点限制:不从参数获取上下文


共 (1) 个答案

  1. # 1 楼答案

    使用^{}

    实施示例:

    class ActivityLifeCycleCallbackImpl implements  Application.ActivityLifecycleCallbacks {
    
        private Set<Activity> set = new HashSet<>();
    
    
        @Override
        public void onActivityStarted(Activity activity) {
            set.add(activity);
        }
    
        @Override
        public void onActivityStopped(Activity activity) {
            set.remove(activity);
    
        }
    
        Activity getCurrentActivity() {
            if (set.isEmpty()) {
                return null;
            }
            return set.iterator().next();
        }
    
    
    }
    

    在自定义应用程序类中:

        ActivityLifeCycleCallbackImpl activityLifeCycleCallback = new ActivityLifeCycleCallbackImpl();
        @Override
        public void onCreate() { 
            registerActivityLifecycleCallbacks(activityLifeCycleCallback);
    
    }