Activityの取得

3411 ワード

    /**
     * 
     * @param context Application
     * @param foregroundOnly
     * @return
     */
    public static List getActivities(Context context, boolean foregroundOnly) {
        List list = new ArrayList();
        try {
            Class activityThreadClass = Class.forName("android.app.ActivityThread");
            Object activityThread = getActivityThread(context, activityThreadClass);
            Field activitiesField = activityThreadClass.getDeclaredField("mActivities");
            activitiesField.setAccessible(true);

            Object collection = activitiesField.get(activityThread);
            Collection c;
            if (collection instanceof HashMap){
                c = ((HashMap)collection).values();
            } else {
                if ((Build.VERSION.SDK_INT >= 19) && (collection instanceof android.util.ArrayMap)){
                    android.util.ArrayMap activities = (android.util.ArrayMap)collection;
                    c = activities.values();
                } else {
                    return list;
                }
            }
            for (Iterator activities = c.iterator(); activities.hasNext(); ) {
                Object activityRecord = activities.next();
                Class activityRecordClass = activityRecord.getClass();
                if (foregroundOnly) {
                    Field pausedField = activityRecordClass.getDeclaredField("paused");
                    pausedField.setAccessible(true);
                    if (pausedField.getBoolean(activityRecord)) {
                        continue;
                    }
                }
                Field activityField = activityRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                Activity activity = (Activity) activityField.get(activityRecord);
                if (activity != null) {
                    list.add(activity);
                }
            }
        }catch (Throwable localThrowable){
            localThrowable.printStackTrace();
        }
        return list;
    }

    public static Object getActivityThread(Context context, Class> activityThread)
    {
        try
        {
            if (activityThread == null) {
                activityThread = Class.forName("android.app.ActivityThread");
            }
            Method m = activityThread.getMethod("currentActivityThread", new Class[0]);
            m.setAccessible(true);
            Object currentActivityThread = m.invoke(null, new Object[0]);
            if ((currentActivityThread == null) && (context != null))
            {
                // Application mLoadedApk, context Application 
                // getApplicationContext() 
                Field mLoadedApk = context.getClass().getField("mLoadedApk");
                mLoadedApk.setAccessible(true);
                Object apk = mLoadedApk.get(context);
                Field mActivityThreadField = apk.getClass().getDeclaredField("mActivityThread");
                mActivityThreadField.setAccessible(true);
                currentActivityThread = mActivityThreadField.get(apk);
            }
            return currentActivityThread;
        } catch (Throwable ignore) {
            ignore.printStackTrace();
        }
        return null;
    }