Question

The following schema has been touted as the way to get application context from anywhere within my android app. But sometimes doing MyApp.getContext() returns null. I tried changing the schema by removing static from getContext() so that I would do MyApp.getInstance().getContext(). It still returns null. How do I fix this? How do I get my application's context from anywhere within my app?

public class MyApp extends Application {
    private static MyApp instance;

    public static MyApp getInstance() {
        return instance;
    }

    public static Context getContext() {
        return instance.getApplicationContext();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        instance = this;
    }
}
Was it helpful?

Solution

Create in onCreate() an instance of getApplicationContext() (mContext) then call MyApp.getContext() from everywhere in your app and you will get your application context statically.

public class MyApp extends Application {
    private static Context mContext;

    public static Context getContext() {
        return mContext;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mContext = getApplicationContext();    
    }
}

Remember to declare into your AndroidManifest.xml

<application android:name="com.mypackage.mypackage.MyApp">
...
...
...
</application>

OTHER TIPS

Create a static instance of the Context in your OnCreate and keep it till you want to get it from a getter method getContext()

From the Application class:

public class MyApp extends Application {

private static Context sContext;
@Override
public void onCreate() {
    sContext = getApplicationContext();
    super.onCreate();
}

public static Context getContext() {
    return sContext;
}
}

Declare it in your Manifest:

<application android:name="com.package.name.MyApp">

Use the following way to get the Application context.

public class MyApp extends Application {
    private static MyApp mAppInstance=null;
    public static Context appContext;

    public static MyApp getInstance() {
        return mAppInstance;
    }

    public static MyApp get() {
        return get(appContext);
    }

    public static MyApp get(Context context) {
        return (MyApp) context.getApplicationContext();
    }

    @Override
    public void onCreate() {
        super.onCreate();
        mAppInstance=this;
        appContext=getApplicationContext();
    }
}

add the the application name inside the Manifest file

<application android:name="packagename.MyApp"/>

to get the context use MyApp.getInstance().getApplicationContext()

instance is never initialized and so has a default value of null. This means that instance.getContext() will throw a NullPointerException. To fix this, you need to initialize the instance variable.

Currently, you have not initialized instance and by default it's value would now be set to null. You need to assign it a value before you can use it.

Another root cause, is due to the buggy backup process. Please refer to

Why backup related process might cause Application's onCreate is not executed?

For get an application context the module should use the application plugin.

build.gradle (:module)

apply plugin: 'com.android.application'

The library plugin has not an app context.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top