我有一些我希望从服务访问的共享首选项(纬度,经度),它不是来自Activity的子类。
特别是,当我尝试访问getPreferences时,此功能在服务上不存在。我的代码发布在
下面我的目标是允许在我的服务中使用这些共享首选项。有什么建议/例子可以帮助我吗?
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);
行
答案 0 :(得分:45)
如果您只为应用程序使用一个SharedPreferences
,请 所有 您的代码通过PreferenceManager.getDefaultSharedPreferences()
获取。
答案 1 :(得分:2)
很少帮助你解决这个问题,但我希望这有助于将来的某些人。 这是你的问题:
public void onCreate() {
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
configEditor = settings.edit();
writeSignalGPS();
}
由于您只在创建服务时检索共享首选项文件,因此服务永远不会正确更新该文件,因此数据永远不会与应用程序共享。在写入共享首选项或检索可能已更改的任何数据之前,请确保再次检索共享首选项文件(重新加载),例如:
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上有一个服务和活动共享共享首选项的场景,您应该使用:
settings = this.getPreferences(MODE_MULTI_PROCESS);
答案 2 :(得分:1)
如果您已将 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。
答案 3 :(得分:1)
对于碰到这个问题的人......我遇到了类似的问题......问题的真正原因是我们试图获取/使用未完全初始化的上下文。我能够正常使用sharedPreferences在我的IntentService的构造函数之外。