Problèmes d'utilisation SharedPreferences sur un service (getPreferences n'existe pas sur un service)
-
26-09-2019 - |
Question
J'ai des préférences partagées (latitude, longitude) que je veux accéder à partir d'un service, qui ne sont pas sous-classé de l'activité.
En particulier, lorsque je tente d'accéder getPreferences, cette fonction n'existe pas de sur un service. Mon code est affiché ci-dessous
Mon but ici est de permettre ECRITURE ces préférences partagées avec mon service. Toutes les suggestions / exemples qui peuvent me aider le long?
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) {}
}
Je reçois l'erreur sur la settings = this.getPreferences(MODE_WORLD_WRITEABLE);
ligne
La solution
Si vous utilisez uniquement un SharedPreferences
pour votre application, ont tous votre code obtenir via PreferenceManager.getDefaultSharedPreferences()
.
Autres conseils
En fait, la plupart d'entre vous être en cours d'exécution dans le problème, que sur les appareils avec API> = 11, les préférences partagées ne sont pas définies pour le processus multi-usages par défaut plus.
Solution:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.HONEYCOMB) {
prefs = getSharedPreferences(PREFS, 0 | Context.MODE_MULTI_PROCESS);
} else {
prefs = getSharedPreferences(PREFS, 0);
}
un peu tard pour vous aider à ce sujet, mais j'espère que cela aide quelqu'un à l'avenir. Voici votre problème:
public void onCreate() {
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
configEditor = settings.edit();
writeSignalGPS();
}
Puisque vous récupérer uniquement le fichier de préférences partagé lorsque le service est créé, le fichier est correctement mis à jour jamais par le service et donc les données ne sont jamais partagées avec l'application. Avant d'écrire à Préférences partagées ou récupérer toutes les données qui peuvent avoir changé, assurez-vous de récupérer le fichier de préférences partagé (reload) à nouveau comme:
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();
}
}
puis dans votre application:
settings = this.getPreferences(MODE_WORLD_WRITEABLE);
String myLat = setttings.getString("mylatitude","");
En outre, quoi que ce soit sur Android 3.0 qui a un scénario où un service et une part d'activité partagée Prefs, vous devez utiliser:
settings = this.getPreferences(MODE_MULTI_PROCESS);
Si vous avez déclaré SharedPreferences comme:
private static final String PREFS_NAME = "UserData";
private static final String PREFS_VALUE1 = "value1";
puis utilisez le code ci-dessous pour chercher des valeurs:
SharedPreferences preferences = context.getSharedPreferences(PREFS_NAME, Context.MODE_PRIVATE);
value1 = preferences.getString(PREFS_VALUE1, "0");
De la même façon, vous pouvez même enregistrer des valeurs à SharedPreferences.
Pour les personnes qui bosse dans ce ... J'ai eu un problème similaire ... La vraie cause du problème est que nous essayons d'obtenir / utiliser un contexte qui n'est pas complètement initialisé .. j'ai pu utiliser sharedPreferences normalement en dehors de mon constructeur pour mon IntentService.