urukh
urukh

Reputation: 380

Android getContext on a background Service

I'm trying to create a Service that runs even when my app is closed. However, I need to use my app Context inside this Service. When the app is running, the service works as well, but when I close the app (onDestroy() was called), the getContext() always returns null.

Service

public class SubscribeService extends Service {

    private Context context;

    @Override
    public IBinder onBind(Intent intent) {
        return null;
    }

    @Override
    public void onCreate() {
        super.onCreate();
        context = this; //Returns null when service is running on background
        context = MyApp.getContext(); //Also null
    }

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
        //do stuff using context
    }

MyApp

public class MyApp extends Application {

    private static Context context;

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

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

Service start from Activity onCreate()

startService(new Intent(this, SubscribeService.class));

How should I use the Context in this scenario?

Edit

Managed to get it to work properly after Onik's help. I just had to call the MyApp.getContext(); before super.onCreate(); Like so:

@Override
public void onCreate() {
    context = MyApp.getContext();
    super.onCreate();
}

Upvotes: 9

Views: 8806

Answers (3)

Onik
Onik

Reputation: 19969

Service extends Context. You can use this, where this is the reference to the Service instance.

Putting more details on my comment below regarding the following code of SubscribeService class:

@Override
public void onCreate() {
    super.onCreate();
    context = this;
    context = MyApp.getContext();
}

In your Service's onCreate() context = this cannot be null by a fundamental programming paradigm.

Upvotes: 12

ʍѳђઽ૯ท
ʍѳђઽ૯ท

Reputation: 16976

Try this:

Added super.onCreate(); before MyApp.context = getApplicationContext();

public class MyApp extends Application {

    private static Context context;

    public void onCreate() {
        super.onCreate();
        MyApp.context = getApplicationContext();
    }

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

Edit: Calling MyApp.getAppContext() will return the application Context.

Upvotes: 5

Martin Zeitler
Martin Zeitler

Reputation: 76799

already once left an answer, which was to use getApplicationContext() in the Service.

also, using an IntentService with Context.startService(Intent) might make sense here.

... and do not insert statements before calling to super.onCreate().

Upvotes: 1

Related Questions