在服务上使用SharedPreferences的问题(getPreferences在服务上不存在)

我有一些我想从服务访问的共享首选项(纬度,经度),这不是从Activity中分类的。

特别是,当我尝试访问getPreferences时,该函数在服务上不存在。 我的代码张贴在下面

我的目标是允许将这些共享偏好写入我的服务。 任何可以帮助我的build议/例子?

public class MyService extends Service implements Runnable { LocationManager mLocationManager; Location mLocation; MyLocationListener mLocationListener; Location currentLocation = null; static SharedPreferences settings; static SharedPreferences.Editor configEditor; public IBinder onBind(Intent intent) { return null; } public void onCreate() { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); writeSignalGPS(); } private void setCurrentLocation(Location loc) { currentLocation = loc; } private void writeSignalGPS() { Thread thread = new Thread(this); thread.start(); } @Override public void run() { mLocationManager = (LocationManager)getSystemService(Context.LOCATION_SERVICE); if (mLocationManager.isProviderEnabled(LocationManager.GPS_PROVIDER)) { Looper.prepare(); mLocationListener = new MyLocationListener(); mLocationManager.requestLocationUpdates( LocationManager.GPS_PROVIDER, 1000, 0, mLocationListener); Looper.loop(); //Looper.myLooper().quit(); } else { Toast.makeText(getBaseContext(), getResources().getString(R.string.gps_signal_not_found), Toast.LENGTH_LONG).show(); } } private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (currentLocation!=null) { configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); configEditor.commit(); } } }; private class MyLocationListener implements LocationListener { @Override public void onLocationChanged(Location loc) { if (loc != null) { Toast.makeText(getBaseContext(), getResources().getString(R.string.gps_signal_found), Toast.LENGTH_LONG).show(); setCurrentLocation(loc); handler.sendEmptyMessage(0); } } @Override public void onProviderDisabled(String provider) {} @Override public void onProviderEnabled(String provider) {} @Override public void onStatusChanged(String provider, int status, Bundle extras) {} } 

我得到错误的行settings = this.getPreferences(MODE_WORLD_WRITEABLE);

Solutions Collecting From Web of "在服务上使用SharedPreferences的问题(getPreferences在服务上不存在)"

如果您仅为您的应用程序使用一个SharedPreferences ,请让所有代码通过PreferenceManager.getDefaultSharedPreferences()获取它。

实际上,大多数人可能会遇到这个问题,在API> = 11的设备上,默认情况下,共享首选项不会被设置为多进程使用。

解:

 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) { prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS); } else { prefs = getSharedPreferences(PREFS, 0); } 

对此,我迟迟不会帮助你,但我希望这可以帮助未来的人。 这是你的问题:

  public void onCreate() { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); writeSignalGPS(); } 

由于您只在创build服务时检索共享首选项文件,因此该文件永远不会被服务正确更新,因此数据永远不会与应用程序共享。 在写入共享首选项或检索任何可能已更改的数据之前,请确保再次检索共享首选项文件(重新加载),例如:

  private Handler handler = new Handler() { @Override public void handleMessage(Message msg) { if (currentLocation!=null) { settings = this.getPreferences(MODE_WORLD_WRITEABLE); configEditor = settings.edit(); configEditor.putString("mylatitude", ""+currentLocation.getLatitude()); configEditor.putString("mylongitude", ""+currentLocation.getLongitude()); configEditor.commit(); } } 

然后在你的应用程序:

  settings = this.getPreferences(MODE_WORLD_WRITEABLE); String myLat = setttings.getString("mylatitude",""); 

此外,Android 3.0上的任何服务和活动都共享共享Prefs的场景,您应该使用:

  settings = this.getPreferences(MODE_MULTI_PROCESS); 

如果您已将SharedPreferences声明为:

 private static final String PREFS_NAME = "UserData"; private static final String PREFS_VALUE1 = "value1"; 

然后使用下面的代码来获取值:

 SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE); value1 = preferences.getString(PREFS_VALUE1, "0"); 

以同样的方式,您甚至可以将值保存到SharedPreferences。

对于遇到这个问题的人来说…我有类似的问题…问题的真正原因是我们正试图获得/使用一个没有完全初始化的上下文..我能够通常使用sharedPreferences在我的我的IntentService的构造函数。