美文网首页
获取Activity

获取Activity

作者: chandarlee | 来源:发表于2016-10-25 17:09 被阅读132次
        /**
         * 
         * @param context Application
         * @param foregroundOnly
         * @return
         */
        public static List<Activity> 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;
        }
    

    相关文章

      网友评论

          本文标题:获取Activity

          本文链接:https://www.haomeiwen.com/subject/ecgruttx.html