Android 中获取当前的 Activity

来源:互联网 发布:知已唯美图片 编辑:程序博客网 时间:2024/06/11 08:43

需求:获取当前的 Activity 对象,Activity 是系统创建的,一种方法:在 onCreate 的时候拿到引用,这样就得修改 onCreate 方法,还得维护一个数组去管理 Activity 的引用。第二种方法:通过反射拿到 ActivityThread 中的 mActivities 属性,进而拿到当前的 activity 对象( paused 为 false 的activity)。

public static Activity getActivity() {    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 = null;        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT) { // 4.4 以下使用的是 HashMap            activities = (HashMap) activitiesField.get(activityThread);        }else{ // 4.4 以上使用的是 ArrayMap            activities = (ArrayMap) activitiesField.get(activityThread);        }        for (Object activityRecord : activities.values()) {            Class activityRecordClass = activityRecord.getClass();            Field pausedField = activityRecordClass.getDeclaredField("paused"); // 找到 paused 为 false 的activity            pausedField.setAccessible(true);            if (!pausedField.getBoolean(activityRecord)) {                Field activityField = activityRecordClass.getDeclaredField("activity");                activityField.setAccessible(true);                Activity activity = (Activity) activityField.get(activityRecord);                return activity;            }        }    } catch (Exception e) {        e.printStackTrace();    }    return null;}

文章来自: http://hanks.xyz

0 0
原创粉丝点击