Android getContext on a background Service

时间:2018-09-18 20:17:35

标签: java android android-service android-context

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();
}

3 个答案:

答案 0 :(得分:6)

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. On the other hand context = MyApp.getContext() can be null but most likely because of this code line located after super.onCreate() in MyApp class:

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

Replace the order of the last two lines.

答案 1 :(得分:3)

尝试一下:

super.onCreate();之前添加了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;
    }
}

编辑:调用MyApp.getAppContext()将返回应用程序Context

答案 2 :(得分:1)

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().