【问题标题】:Is it possible to access Context, Application, Activity anywhere statically?是否可以在任何地方静态访问上下文、应用程序、活动?
【发布时间】:2022-07-21 17:09:42
【问题描述】:

所以问题是,真的可以在任何地方访问ContextApplication 和特别是Activity。和其他不传参数的静态类方法一样吗?

例如:

public static class Main{

    public static void main(String...args){
        Application app = /* GET APPLICATION */;
        Activity act = /* GET ACTIVITY */;
        Context c = /* GET CONTEXT */;

        // USE THEM
    }
}

【问题讨论】:

  • 这可能吗?如果您运行一个普通的旧 java main,那么当前的 Activity 应该是什么?

标签: java android android-activity reflection android-application-class


【解决方案1】:

是的,可能是这样的:

public static void main(String...args){
    Application app = getApplication();
    Activity act = getActivity();
    Context c = /* app or act, both are Contexts so u can use them as needed */;

    // USE THEM
}

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<Object, Object> activities = (Map<Object, Object>) activitiesField.get(activityThread);

        for (Object activityRecord : activities.values()) {
            try
            {
                Class activityRecordClass = activityRecord.getClass();
                Field pausedField = activityRecordClass.getDeclaredField("paused");
                pausedField.setAccessible(true);

                boolean paused=pausedField.getBoolean(activityRecord);

                Field activityField = activityRecordClass.getDeclaredField("activity");
                activityField.setAccessible(true);
                Activity activity = (Activity) activityField.get(activityRecord);

                if(!paused){
                    return activity;
                }
            }
            catch (Throwable e)
            {}
        }
    }catch (Throwable e)
    {}
    return null;
}

public static Application getApplicationContext(){
    try
    {
        Application i=(Application)Class.forName("android.app.ActivityThread")
            .getMethod("currentApplication").invoke(null, null);
            
        if(i==null){
            throw new NullPointerException();
        }
        return i;
    }
    catch (Throwable e)
    {
        try
        {
            Application i=(Application)Class.forName("android.app.AppGlobals")
                .getMethod("getInitialApplication").invoke(null, null);
            if(i==null){
                throw new NullPointerException();
            }
            return i;
        }
        catch (Throwable e2)
        {
            return null;
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-22
    • 1970-01-01
    • 2017-10-23
    • 1970-01-01
    • 2011-11-03
    • 2017-09-26
    • 2023-03-19
    相关资源
    最近更新 更多