Probleme mit SharedPreferences auf einem Service (getPreferences existiert nicht auf einem Dienst)

Ich habe einige gemeinsame Vorlieben (Breitengrad, Längengrad), die ich von einem Dienst zugreifen möchte, der nicht von der Aktivität untergeordnet ist.

Insbesondere wenn ich versuche, auf getPreferences zuzugreifen, existiert diese Funktion nicht bei einem Dienst. Mein Code ist unten gepostet

Mein Ziel hier ist, WRITE diese geteilten Vorlieben mit meinem Service zu erlauben. Irgendwelche Vorschläge / Beispiele, die mir helfen können?

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

Ich bekomme den Fehler auf der Zeile settings = this.getPreferences(MODE_WORLD_WRITEABLE);

  • Problem beim Speichern von gemeinsamen Einstellungen in Android
  • Kopieren / Freigeben von Konfigurationen zwischen bezahlten / kostenlosen Versionen von Android App?
  • Android SharedPreferences Update funktioniert nicht
  • SharedPreferences Anwendungskontext vs Aktivitätskontext
  • Android Unit Test: So löschen Sie SharedPreferences
  • Daten-Cache in freigegebener Präferenz
  • Getting Integer- oder Indexwerte aus einer Listenpräferenz
  • Gemeinsame Einstellungen in broadcastreceiver
  • 5 Solutions collect form web for “Probleme mit SharedPreferences auf einem Service (getPreferences existiert nicht auf einem Dienst)”

    Wenn Sie nur eine SharedPreferences für Ihre Anwendung verwenden, haben Sie alle Ihren Code über PreferenceManager.getDefaultSharedPreferences() .

    Tatsächlich können die meisten von euch in das Problem laufen, dass bei Geräten mit API> = 11 die gemeinsamen Einstellungen für die Multi-Prozess-Nutzung standardmäßig nicht mehr festgelegt sind.

    Lösung:

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

    Wenig spät, um dir zu helfen, aber ich hoffe das hilft jemand in der Zukunft. Hier ist dein Problem:

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

    Da Sie die freigegebene Präferenzdatei nur abrufen, wenn der Dienst erstellt wird, wird die Datei vom Service nie ordnungsgemäß aktualisiert und somit werden die Daten niemals mit der Anwendung geteilt. Bevor Sie auf Freigegebene Einstellungen schreiben oder alle Daten abrufen, die sich möglicherweise geändert haben, stellen Sie sicher, dass Sie die freigegebene Voreinstellungsdatei (neu laden) erneut abrufen:

      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(); } } 

    Dann in deiner Anwendung:

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

    Auch alles auf Android 3.0, die ein Szenario, wo ein Dienst und eine Aktivität teilen Shared Prefs, sollten Sie verwenden:

      settings = this.getPreferences(MODE_MULTI_PROCESS); 

    Wenn Sie SharedPreferences als:

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

    Dann verwenden Sie den untenstehenden Code, um Werte zu holen:

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

    In gleicher Weise können Sie sogar Werte in SharedPreferences speichern.

    Für Leute, die in dieses stoßen … Ich hatte ein ähnliches Problem … Die wahre Ursache des Problems ist, dass wir versuchen, einen Kontext zu bekommen / verwenden, der nicht vollständig initialisiert ist. Ich war in der Lage, sharedPreferences normalerweise außerhalb von mir zu benutzen Konstruktor für meinen IntentService.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.