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