美文网首页
获取activity 的方式

获取activity 的方式

作者: 华人有为 | 来源:发表于2019-08-26 15:35 被阅读0次

获取当前所在的activity 的方式


 /**
     * 通过反射 获取activity
     */
    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) {
            Log.e("错误要处理:",e.toString());
            //e.printStackTrace();
        } catch (InvocationTargetException e) {
            Log.e("错误要处理:",e.toString());
            //e.printStackTrace();
        } catch (NoSuchMethodException e) {
            Log.e("错误要处理:",e.toString());
            //e.printStackTrace();
        } catch (NoSuchFieldException e) {
            Log.e("错误要处理:",e.toString());
            //e.printStackTrace();
        } catch (IllegalAccessException e) {
            Log.e("错误要处理:",e.toString());
            //e.printStackTrace();
        }
        return null;
    }


/**
     * 备用 方案通过上下文获取activity
     * @return
     */
    private Activity getActivity() {
        Context context = mContext;

        while (!(context instanceof Activity) && context instanceof ContextWrapper) {
            context = ((ContextWrapper) context).getBaseContext();
        }

        if (context instanceof Activity) {
            return (Activity) context;
        }

        //第二种 通过上下文获取activity 的方法也失败了
        try {
            throw new Exception();
        } catch (Exception e) {
            e.printStackTrace();
        }

        return null;
    }

相关文章

网友评论

      本文标题:获取activity 的方式

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