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

时间:2017-03-22 11:05:28

标签: android android-service android-context

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

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

$query = $this->db->query("YOUR QUERY");

foreach ($query->result_array() as $row)
{
        echo $row['title'];
        echo $row['name'];
        echo $row['body'];
}

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

时,似乎这是空的
SharedPreferenceManager

我是如何在清单中宣布我的两项服务的:

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

你有想法吗?

谢谢!

2 个答案:

答案 0 :(得分:7)

  

当应用程序尝试使用时抛出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);
    }

答案 1 :(得分:0)

您应该拥有活动的背景信息。服务的背景不起作用。 在构造函数中传递上下文并使用该上下文传递下一个构造函数。

public SyncOfflineCoursesService(Context mContext) {

     sharedPreferenceManager = new SharedPreferenceManagerToReplace(mContext); 

}