Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何获取当前顶级活动上下文_Java_Android - Fatal编程技术网

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

Java 如何获取当前顶级活动上下文,java,android,Java,Android,在我的静态方法(参数只有一个字符串)中,我想使用Dialog(newalertdialog.Builder(mContext)),但Dialog需要一个活动上下文来构造。如果我不通过外部上下文参数,仅通过反射或其他方法,如何获取当前顶级活动的对象 public static Activity getActivity() { Class activityThreadClass = null; try { activityThreadClass = Class.for

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

public static Activity getActivity() {
    Class activityThreadClass = null;
    try {
        activityThreadClass = Class.forName("android.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
为空

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

使用

实施示例:

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可以解决我的问题~谢谢
    ActivityLifeCycleCallbackImpl activityLifeCycleCallback = new ActivityLifeCycleCallbackImpl();
    @Override
    public void onCreate() { 
        registerActivityLifecycleCallbacks(activityLifeCycleCallback);

}