反射操作Activity栈的工具类
来源:互联网 发布:微销通软件下载 编辑:程序博客网 时间:2024/05/21 10:32
记录一下今天用到的几个反射操作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; }
阅读全文
0 0
- 反射操作Activity栈的工具类
- 反射操作工具类
- Map的基本操作工具类-----反射赋值原理
- 利用反射进行操作的一个工具类
- 反射的工具类
- 反射的工具类
- 反射的工具类
- activity的工具类
- 基于反射的工具类
- [Activity的工具类]BaseAppManager
- 万能的JDBC工具类。通过反射机制直接简单处理数据库操作
- 使用javassist代替反射完成类属性操作工具类
- Java反射的简明应用-反射工具类
- 很有用的反射工具类
- Java反射的工具类BeanUtils
- Spring的反射工具类 ReflectionUtils
- 一个很好用的反射工具类
- 工具类-反射工具类
- webStorm的使用即常用快捷键
- 暑期集训之喷水装置(二)
- 液力变矩器和发动机的匹配
- Hrbust 2232 股票【暴力枚举+最大连续子序列和】水题= =
- JDK源码-Collection-add()以及addAll()
- 反射操作Activity栈的工具类
- Centos服务器配置操作
- 内核
- 为什么你用python3.6 编译dbus-python告诉你configure: error: could not find Python headers
- 2017 Multi-University Training Contest
- 聚类
- 基于注解的Spring AOP的配置和使用
- Android信鸽推送全解
- PHP header 的几种用法