2010-11-18 9 views
27

Ich habe einige gemeinsame Einstellungen (Breite, Länge), auf die ich von einem Service zugreifen möchte, der nicht von Activity abgeleitet ist.Probleme bei der Verwendung von SharedPreferences für einen Service (getPreferences gibt es für einen Service nicht)

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

geschrieben Mein Ziel hier ist es, diese gemeinsamen Voreinstellungen mit meinem Dienst zu schreiben. Irgendwelche Vorschläge/Beispiele, die mir weiterhelfen 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 erhalte den Fehler auf der Linie settings = this.getPreferences(MODE_WORLD_WRITEABLE);

Antwort

43

Wenn Sie nur eine SharedPreferences für Ihre Anwendung verwenden, müssen alle Ihr Code es über PreferenceManager.getDefaultSharedPreferences() bekommen.

+0

können Sie mir ein wenig mehr erklären, was ich auf meinem Code ändern muss, um Präferenzmanager zu verwenden? Ich suche auf Google, aber ich kann keine Informationen finden, die für mich gültig sind – NullPointerException

+1

@ AndroidUser99: Sie ersetzen Aufrufe zu 'getPreferences()' mit einem Aufruf von 'PreferenceManager.getDefaultSharedPreferences()'. – CommonsWare

+0

Ich versuchte es mit: Einstellungen = PreferenceManager.getDefaultSharedPreferences (MODE_WORLD_WRITEABLE); aber gibt mir einen Fehler, was ich falsch mache? – NullPointerException

1

Wenn Sie SharedPreferences erklärt haben als:

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

dann den folgenden Code verwenden, um Werte zu holen:

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

In gleicher Weise Sie auch Werte zu SharedPreferences speichern.

2

Wenig spät, um Ihnen dabei zu helfen, aber ich hoffe, das hilft jemandem in der Zukunft. Hier ist Ihr Problem:

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

Da Sie nur die Gemeinsame Preference-Datei abgerufen werden, wenn der Dienst erstellt wird, wird die Datei nie richtig durch den Dienst aktualisiert und somit werden die Daten niemals mit der Anwendung gemeinsam genutzt. Vor dem Schreiben auf Gemeinsam genutzte Einstellungen oder jede Abrufen von Daten, die sich geändert haben kann, stellen Sie sicher, dass die Gemeinsame Einstellungsdatei (neu laden) wieder wie abzurufen:

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 Ihrer Anwendung:

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

Auch alles auf Android 3.0, das ein Szenario hat, wo ein Dienst und ein Aktivitätsanteil Geteilt Prefs, sollten Sie verwenden: Eigentlich

 settings = this.getPreferences(MODE_MULTI_PROCESS); 
19

, die meisten von euch vielleicht in die p laufen Problem, dass auf Geräten mit API> = 11 die gemeinsamen Einstellungen nicht mehr standardmäßig auf die Verwendung mehrerer Prozesse eingestellt 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); 
} 
+1

Wie Kommentar zu @CommonsWare Antwort, wie können Sie dies mit '' PreferenceManager.getDefaultSharedPreferences() ''? Ich bin in einem Dienst und ich kenne den Namen meiner gemeinsamen Standardeinstellungen nicht. – gozzilli

+0

Wirklich retten Sie mich. Thanx a lotttttttttttttttttt –

+0

'MODE_MULTI_PROCESS' wurde in API 23 veraltet. Siehe http://developer.android.com/reference/android/content/Context.html#MODE_MULTI_PROCESS –

1

Für Menschen, die in diesen stoßen ... Ich hatte ein ähnliches Problem ... Die wahre Ursache des Problems ist, dass wir versuchen, einen Kontext zu erhalten/verwenden, die nicht voll ist initialisiert .. Ich konnte sharedPreferences normalerweise außerhalb meines Konstruktors für meinen IntentService verwenden.

Verwandte Themen