Mein Ziel ist es, einen Hintergrunddienst zu haben, der zweimal täglich eine ziemlich große Datenmenge aktualisiert (~ 5min Aktualisierung, möglicherweise mehr).Context ist im Service-Konstruktor null?
So habe ich eine GcmTaskService, die diesen Dienst starten:
public class SyncOfflineCoursesService extends Service {
private final IBinder mBinder = new MonBinder();
private final SharedPreferenceManagerToReplace sharedPreferenceManager;
public SyncOfflineCoursesService() {
sharedPreferenceManager = new SharedPreferenceManagerToReplace(this); //crash on this line
}
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
...
}
@Override
public IBinder onBind(Intent intent) {
return mBinder;
}
public class MonBinder extends Binder {
SyncOfflineCoursesService getService() {
return SyncOfflineCoursesService.this;
}
}
}
SharedPreferenceManagerToReplace
:
public class SharedPreferenceManagerToReplace {
private final SharedPreferences prefs;
public SharedPreferenceManagerToReplace(Context context) {
this.prefs = PreferenceManager.getDefaultSharedPreferences(context);//crash here
}
}
, aber es scheint, dass diese Null ist, wenn ich instanziieren SharedPreferenceManager
Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
Das ist, wie Ich habe beide meiner Dienste in meinem Manifest erklärt:
<service
android:name=".service.offline.SyncOfflineCoursesService"
android:exported="false" />
<service
android:name=".service.offline.SyncOfflineContentService"
android:exported="true"
android:permission="com.google.android.gms.permission.BIND_NETWORK_TASK_SERVICE">
<intent-filter>
<action android:name="com.google.android.gms.gcm.ACTION_TASK_READY" />
</intent-filter>
</service>
Hätten Sie eine Idee?
Danke!
Verwenden Sie Application Level Kontext für diese –
Ihr 'Service' sollte nicht wirklich einen Konstruktor haben. Verschieben Sie diese Initialisierung in eine ihrer Lebenszyklusmethoden, wie 'onCreate()' oder 'onStartCommand()'. –