Probleme SharedPreferences auf einem Service (getPreferences existieren nicht auf einen Service) unter Verwendung von

StackOverflow https://stackoverflow.com/questions/4214939

Frage

Ich habe einige gemeinsamen Präferenzen (Breitengrad, Längengrad), dass ich von einem Dienst zugreifen möchten, die nicht von Aktivität subclassed wird.

Insbesondere dann, wenn ich den Zugriff auf getPreferences versuchen, diese Funktion nicht vorhanden ist auf einen Dienst. Mein Code wird veröffentlicht unter

Mein Ziel hier ist WRITE diese gemeinsamen Vorlieben mit meinem Service zu ermöglichen. Irgendwelche Vorschläge / Beispiele, die entlang der mir helfen kann?

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 den Fehler auf der Linie settings = this.getPreferences(MODE_WORLD_WRITEABLE); bekommen

War es hilfreich?

Lösung

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

Andere Tipps

die meisten von euch Eigentlich könnten in das Problem ausgeführt werden, dass bei Geräten mit API> = 11, werden die gemeinsamen Einstellungen nicht für Multi-Prozess Verwendung vorbelegt mehr.

Lösung:

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

Little spät Sie auf diese, um zu helfen, aber ich hoffe, dass dies jemand in der Zukunft hilft. Hier ist Ihr Problem:

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

Da Sie nur die freigegebenen 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 freigegebenen Einstellungen oder alle Daten abgerufen, die bereits verändert haben können, stellen Sie sicher, dass die Gemeinsame Einstellungsdatei (neu laden) abgerufen werden wieder wie:

    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 der 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:

     settings = this.getPreferences(MODE_MULTI_PROCESS);

Wenn Sie erklärt haben, SharedPreferences wie:

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

verwenden Sie dann die folgenden Codewerte 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 speichern zu SharedPreferences.

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, das nicht vollständig initialisiert ist .. Ich war in der Lage sharedPreferences normalerweise verwenden außerhalb meines Konstruktor für mein IntentService.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top