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