服务构造函数中的Context是null?

Ren*_*ier 3 android android-service android-context

我的目标是拥有一个后台服务,每天更新两次相当大量的数据(更新约5分钟,可能更多).

所以我有一个启动此服务的GcmTaskService:

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

}
Run Code Online (Sandbox Code Playgroud)

SharedPreferenceManagerToReplace :

public class SharedPreferenceManagerToReplace {
    private final SharedPreferences prefs;

    public SharedPreferenceManagerToReplace(Context context) {
        this.prefs = PreferenceManager.getDefaultSharedPreferences(context);//crash here
    }
}
Run Code Online (Sandbox Code Playgroud)

但是当我实现时,它似乎是空的 SharedPreferenceManager

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String android.content.Context.getPackageName()' on a null object reference
Run Code Online (Sandbox Code Playgroud)

这就是我在清单中声明我的两项服务的方式:

<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>
Run Code Online (Sandbox Code Playgroud)

你有什么想法吗?

谢谢 !

Int*_*iya 8

当应用程序尝试使用具有null值的对象引用时,将引发NullPointerException.

你应该在onStartCommand()部分调用它.

 Context context;  //Public  

 @Override
    public int onStartCommand(Intent intent, int flags, int startId) 
    {
    context= getApplicationContext();
    sharedPreferenceManager = new SharedPreferenceManagerToReplace(context); 
    return super.onStartCommand(intent, flags, startId);
    }
Run Code Online (Sandbox Code Playgroud)