Problemi nell'utilizzo SharedPreferences su un servizio (getPreferences non esiste su un servizio)
-
26-09-2019 - |
Domanda
ho alcune preferenze condivise (latitudine, longitudine) che voglio l'accesso da un servizio, che non è una sottoclasse di attività.
In particolare, quando si tenta di getPreferences di accesso, questa funzione non esiste di un servizio. Il mio codice è pubblicato sotto
Il mio obiettivo qui è quello di permettere scrivere queste preferenze in comune con il mio servizio. Eventuali suggerimenti / esempi che mi può aiutare a lungo?
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) {}
}
ottengo l'errore sulla linea settings = this.getPreferences(MODE_WORLD_WRITEABLE);
Soluzione
Se si utilizza un solo SharedPreferences
per la vostra applicazione, hanno tutti il codice di farlo tramite PreferenceManager.getDefaultSharedPreferences()
.
Altri suggerimenti
In realtà, la maggior parte di voi potrebbe essere in esecuzione nel problema, che su dispositivi con API> = 11, le preferenze condivise non sono impostate per l'uso a più processi per default più.
Soluzione:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS);
} else {
prefs = getSharedPreferences(PREFS, 0);
}
Un po 'tardi per aiutarti su questo, ma spero che questo aiuta qualcuno in futuro. Ecco il problema:
public void onCreate() {
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
configEditor = settings.edit();
writeSignalGPS();
}
Dal momento che si recupera solo il file Preferenza condiviso quando viene creato il servizio, il file non viene mai aggiornato correttamente dal servizio e, quindi, i dati vengono mai condivisi con l'applicazione. Prima di scrivere a Preferenze condivise o il recupero di tutti i dati che possono essere modificate, assicurarsi di recuperare il file Preferenza condivisa (reload) di nuovo tipo:
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();
}
}
quindi nella vostra applicazione:
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
String myLat = setttings.getString("mylatitude","");
Inoltre, qualsiasi cosa su Android 3.0 che dispone di uno scenario in cui un servizio e una quota di attività Preferenze condivise, è necessario utilizzare:
settings = this.getPreferences(MODE_MULTI_PROCESS);
Se avete dichiarato SharedPreferences come:
private static final String PREFS_NAME = "UserData";
private static final String PREFS_VALUE1 = "value1";
quindi utilizzare il codice qui sotto per andare a prendere i valori:
SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
value1 = preferences.getString(PREFS_VALUE1, "0");
In stesso modo è anche possibile salvare i valori di SharedPreferences.
Per le persone che urtano questo ... Ho avuto un problema simile ... La vera causa del problema è che stiamo cercando di ottenere / utilizzare un contesto che non è completamente inizializzato .. Ero in grado di utilizzare normalmente sharedPreferences al di fuori della mia costruttore per la mia IntentService.