Static way to get 'Context' in Android?

前端 未结 19 2699
猫巷女王i
猫巷女王i 2020-11-21 06:36

Is there a way to get the current Context instance inside a static method?

I\'m looking for that way because I hate saving the \'Context\' instance eac

19条回答
  •  广开言路
    2020-11-21 07:16

    The majority of apps that want a convenient method to get the application context create their own class which extends android.app.Application.

    GUIDE

    You can accomplish this by first creating a class in your project like the following:

    import android.app.Application;
    import android.content.Context;
    
    public class App extends Application {
    
        private static Application sApplication;
    
        public static Application getApplication() {
            return sApplication;
        }
    
        public static Context getContext() {
            return getApplication().getApplicationContext();
        }
    
        @Override
        public void onCreate() {
            super.onCreate();
            sApplication = this;
        }
    }
    

    Then, in your AndroidManifest you should specify the name of your class in the AndroidManifest.xml’s tag:

    
        ...
    
    

    You can then retrieve the application context in any static method using the following:

    public static void someMethod() {
        Context context = App.getContext();
    }
    

    WARNING

    Before adding something like the above to your project you should consider what the documentation says:

    There is normally no need to subclass Application. In most situation, static singletons can provide the same functionality in a more modular way. If your singleton needs a global context (for example to register broadcast receivers), the function to retrieve it can be given a Context which internally uses Context.getApplicationContext() when first constructing the singleton.


    REFLECTION

    There is also another way to get the application context using reflection. Reflection is often looked down upon in Android and I personally think this should not be used in production.

    To retrieve the application context we must invoke a method on a hidden class (ActivityThread) which has been available since API 1:

    public static Application getApplicationUsingReflection() throws Exception {
        return (Application) Class.forName("android.app.ActivityThread")
                .getMethod("currentApplication").invoke(null, (Object[]) null);
    }
    

    There is one more hidden class (AppGlobals) which provides a way to get the application context in a static way. It gets the context using ActivityThread so there really is no difference between the following method and the one posted above:

    public static Application getApplicationUsingReflection() throws Exception {
        return (Application) Class.forName("android.app.AppGlobals")
                .getMethod("getInitialApplication").invoke(null, (Object[]) null);
    } 
    

    Happy coding!

提交回复
热议问题