可以使用反射来获取ActivityManagerService中的mTopResumedActivity字段。以下是代码示例:

public static ComponentName getTopResumedActivity(ComponentName defaultComponentName) {
    try {
        Class<?> activityManagerNativeClass = Class.forName("android.app.ActivityManagerNative");
        Object am = activityManagerNativeClass.getMethod("getDefault").invoke(activityManagerNativeClass);
        Object activityThread = am.getClass().getMethod("getActivityThread").invoke(am);
        Class<?> activityThreadClass = Class.forName("android.app.ActivityThread");
        Object activityClientRecord = activityThreadClass.getMethod("getTopResumedActivityClient").invoke(activityThread);
        Field field = activityClientRecord.getClass().getDeclaredField("activity");
        field.setAccessible(true);
        Activity activity = (Activity) field.get(activityClientRecord);
        return activity.getComponentName();
    } catch (Exception e) {
        e.printStackTrace();
    }
    return defaultComponentName;
}

在上述代码中,我们首先获取ActivityManagerNative的实例,然后通过反射获取ActivityThread实例。接着,我们调用ActivityThread的getTopResumedActivityClient方法来获取ActivityClientRecord实例,并通过反射获取activity字段。最后,我们可以通过activity.getComponentName()方法获取当前Top Resumed Activity的ComponentName。

需要注意的是,这种方式是通过反射来获取系统内部的变量,可能会存在兼容性和稳定性问题。建议谨慎使用

Android开发: 怎么通过ActivityManagerService反射得到mTopResumedActivity有示例代码吗?最好是兼容各个API版本的

原文地址: http://www.cveoy.top/t/topic/hcAx 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录