记录一下今天用到的几个反射操作activity栈的方法。
获取当前栈顶activity
/**
* 获取当前activity
* @return
*/
public static Activity getCurrentActivity() {
try {
Class 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 (InvocationTargetException e) {
e.printStackTrace();
} catch (NoSuchMethodException e) {
e.printStackTrace();
} catch (NoSuchFieldException e) {
e.printStackTrace();
} catch (IllegalAccessException e) {
e.printStackTrace();
}
return null;
}
获取整个Activity栈
/**
* 获取栈
* @param application
* @return
*/
public static List<Activity> getActivitiesByApplication(Application application) {
List<Activity> list = new ArrayList<>();
try {
Class<Application> applicationClass = Application.class;
Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
mLoadedApkField.setAccessible(true);
Object mLoadedApk = mLoadedApkField.get(application);
Class<?> mLoadedApkClass = mLoadedApk.getClass();
Field mActivityThreadField = mLoadedApkClass.getDeclaredField("mActivityThread");
mActivityThreadField.setAccessible(true);
Object mActivityThread = mActivityThreadField.get(mLoadedApk);
Class<?> mActivityThreadClass = mActivityThread.getClass();
Field mActivitiesField = mActivityThreadClass.getDeclaredField("mActivities");
mActivitiesField.setAccessible(true);
Object mActivities = mActivitiesField.get(mActivityThread);
if (mActivities instanceof Map) {
@SuppressWarnings("unchecked") Map<Object, Object> arrayMap = (Map<Object, Object>) mActivities;
for (Map.Entry<Object, Object> entry : arrayMap.entrySet()) {
Object value = entry.getValue();
Class<?> activityClientRecordClass = value.getClass();
Field activityField = activityClientRecordClass.getDeclaredField("activity");
activityField.setAccessible(true);
Object o = activityField.get(value);
list.add((Activity) o);
}
}
} catch (Exception e) {
e.printStackTrace();
list = null;
}
if(null != list ){
for (Activity act:list) {
L.i("act.getLocalClassName() =="+act.getLocalClassName());
L.i("act.getComponentName() =="+act.getComponentName());
L.i("act.getPackageName() =="+act.getPackageName());
}
}else {
L.i("栈为空");
}
return list;
}
获取栈中MainActivity的实例
这个方法其实就是调用上面那个获取全栈的方法,然后遍历调用Activity.getLocalName(),筛选出你项目内的MainActivity
/**
* 获取栈中MainActivity的实例
* @param outActivity
* @return
*/
public static MainActivity getTheMainActivity(Activity outActivity) {
Activity mainActivityObj = null;
List<Activity> activitiesByApplication = AppUtils.getActivitiesByApplication(outActivity.getApplication());
if (null != activitiesByApplication && activitiesByApplication.size() > 0) {
for (Activity activity : activitiesByApplication) {
if (activity.getLocalClassName().equals("com.xxx.yyy.main.MainActivity")) {
mainActivityObj = activity;
break;
}
}
}
return (MainActivity) mainActivityObj;
}
本文介绍如何使用Java反射机制获取Android应用程序中的当前Activity、整个Activity栈以及特定的MainActivity实例。通过这些方法可以实现对Activity栈的有效管理和操作。
1061

被折叠的 条评论
为什么被折叠?



