Android开发者应该避免使用反射来访问隐藏的API,这是不被推荐的做法。因为这样做可能会导致您的应用程序在不同的设备和操作系统版本上出现问题,甚至可能会在未来的版本中停止工作。

相反,您可以使用公共API来获取当前正在运行的Activity。以下是一个简单的示例:

// 获取ActivityManager
ActivityManager activityManager = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);

// 获取正在运行的任务
List<ActivityManager.RunningTaskInfo> runningTasks = activityManager.getRunningTasks(1);

// 获取顶部Activity
ActivityManager.RunningTaskInfo runningTaskInfo = runningTasks.get(0);
ComponentName topActivity = runningTaskInfo.topActivity;

// 打印顶部Activity的名称
Log.d("Top Activity", topActivity.getPackageName() + "/" + topActivity.getClassName());

这个示例使用了ActivityManager的公共API来获取当前正在运行的任务和顶部Activity。请注意,这种方法可能会返回一个空列表,或者在某些情况下,可能会返回一个非预期的Activity。

如果您仍然需要使用反射来访问隐藏的API,请确保您已经测试了您的代码,并且能够在不同的设备和操作系统版本上正常工作。以下是一个示例代码,用于通过ActivityManagerService反射得到mTopResumedActivity:

try {
    // 获取ActivityManagerService
    Class<?> activityManagerServiceClass = Class.forName("android.app.ActivityManagerNative");
    Object activityManagerService = activityManagerServiceClass.getMethod("getDefault").invoke(activityManagerServiceClass);
 
    // 获取mTopResumedActivity字段
    Field mTopResumedActivityField = activityManagerService.getClass().getDeclaredField("mTopResumedActivity");
    mTopResumedActivityField.setAccessible(true);
    ComponentName mTopResumedActivity = (ComponentName) mTopResumedActivityField.get(activityManagerService);
 
    // 打印顶部Activity的名称
    Log.d("Top Activity", mTopResumedActivity.getPackageName() + "/" + mTopResumedActivity.getClassName());
} catch (Exception e) {
    e.printStackTrace();
}

请注意,这个示例代码只是作为参考,因为它仍然可能会在某些设备和操作系统版本上出现问题。因此,您应该避免使用这种方式来访问隐藏的API,而是使用公共API来获取当前正在运行的Activity

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

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

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