反射操作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;    }
原创粉丝点击