高中生

- 金币
- 78
- 好评
- 4
- 信誉
- 98

|
本帖最后由 ❝QWQ❞ 于 2022-8-9 06:33 编辑
代码(代码可能有问题,但我测试能用):
- /**
- * 获取Application
- */
- public static Application getApplication() {
- try {
- // 获取ActivityThread
- Class<?> activityThreadClass=Class.forName("android.app.ActivityThread");
- Method currentActivityThreadMethod=activityThreadClass.getDeclaredMethod("currentActivityThread");
- Object activityThreadObj=currentActivityThreadMethod.invoke(null);
- activityThreadClass = activityThreadObj.getClass();
- // 获取Application
- Method getApplicationMethod=activityThreadClass.getDeclaredMethod("getApplication");
- Application app=(Application)getApplicationMethod.invoke(activityThreadObj);
- return app;
- } catch (Exception e) {
- ExceptionHandler.onException(e);
- return null;
- }
- }
- /**
- * 获取插件管理页面Activity对象
- */
- public static Activity getActivity() {
- try {
- Class<Application> applicationClass = Application.class;
- Field mLoadedApkField = applicationClass.getDeclaredField("mLoadedApk");
- mLoadedApkField.setAccessible(true);
- Object mLoadedApk = mLoadedApkField.get(getApplication());
- 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);
- // ActivityThread.ActivityClientRecord
- Object mActivities = mActivitiesField.get(mActivityThread);
- // 注意这里一定写成Map,低版本这里用的是HashMap,高版本用的是ArrayMap
- 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 activityObj = activityField.get(value);
- String className=activityObj.getClass().getName();
- if(!"bin.mt.plus.Main".equals(className)){
- return (Activity)activityObj;
- }
-
- }
- }
- } catch (Exception e) {
- // 异常
- }
- return null;
- }
复制代码 |
|