Kann ich Daten von freigegebenen Einstellungen innerhalb eines Dienstes abrufen?

Lesezeit: 4 Minuten

Benutzer-Avatar
SIVAKUMAR.J

Ich entwickle eine Android-Anwendung. Ich verwende Android 2.2

In meiner Anwendung erfasse ich GPS-Daten und sende sie mit dem Zeitintervall von 1 Stunde an den Dienst. Wenn der Benutzer die Anwendung beendet, funktioniert es auch (es ist erforderlich).

Ich verwende 2 Dienste (benutzerdefiniert), einen zum Erfassen von GPS-Daten und einen zum Senden an den Server.

Hier mein Zweifel

  • Können wir im Service gemeinsame Präferenzen verwenden?

  • Wenn wir bei irgendeiner Aktivität der Anwendung Daten in gemeinsamen Einstellungen speichern, können wir diese Daten im Dienst mit Hilfe der gemeinsamen Einstellungen verwenden?

  • Beste Antwort hier gefunden stackoverflow.com/questions/6446221/…

    – Ajit Kumar Dubey

    11. April 2016 um 9:11 Uhr

Sie können auf die standardmäßige gemeinsame Voreinstellungsinstanz zugreifen, die von allen Ihren gemeinsam genutzt wird Activity und Service Klassen, telefonisch PreferenceManager.getDefaultSharedPreferences(Context context):

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this);

Dies eignet sich hervorragend zum Speichern einfacher Primitive (wie boolesche Werte) oder serialisierbare Objekte. Wenn Sie jedoch viele Standortdaten erfassen, sollten Sie stattdessen eine SQLite-Datenbank verwenden.

  • Diese Antwort kombiniert damit: Der Kontext innerhalb des Dienstes wird erst sichtbar, wenn onStart oder onStartCommand in services: stackoverflow.com/questions/7619917/… dies für mich gelöst hat.

    – Klasse

    15. August 2013 um 20:56 Uhr

  • Sie können jederzeit das Ergebnis des Dienstes übergeben getApplicationContext() Methode statt.

    – Twaddington

    16. August 2013 um 5:51 Uhr

  • @twaddington Also, wenn wir verwenden getSharedPreferences(String, Context) die Präferenzen würden nicht geteilt?

    – Sohaib

    17. April 2015 um 7:20 Uhr

  • @twaddington: Ich verwende auch die gemeinsame Einstellung für meine Aktivitäten und Dienste wie mPrefsRead = context.getSharedPreferences(PREFS, Context.MODE_PRIVATE); . Aber manchmal erhalte ich die Standardwerte aus den Einstellungen, wie wenn ich mPrefsWrite.putBoolean(KEY, true) schreibe, aber beim Lesen wie mPrefsRead.getBoolean(KEY_LOGIN_STATUS, false); falsch bekomme. Ich habe auch bestätigt, dass der Wert nirgendwo falsch gesetzt ist. Meine App und Dienste werden als unterschiedliche Prozesse ausgeführt, was dazu führt, dass Standardwerte aus den Einstellungen abgerufen werden, wie in einigen SO-Antworten angegeben. Ist es möglich, dies mit Ihrer Antwort zu lösen?

    – Madhan

    15. August 2017 um 16:36 Uhr

  • Dies ist die richtige Antwort. Danke an twaddington und zum Beispiel in MyService Class and Method unten: @Override public void onCreate() { super.onCreate(); Log.d (TAG, “onCreate”); SharedPreferences-Einstellungen = PreferenceManager.getDefaultSharedPreferences(this); String email = preferences.getString(“email_address”, “[email protected]”); mythread = new MyThread(E-Mail); Toast.makeText(this, email, Toast.LENGTH_LONG).show(); }

    – Mist

    29. August 2018 um 17:36 Uhr


Ich finde die Lösung.

Innerhalb eines Dienstes rufen wir die folgende Methode auf, um die gemeinsamen Einstellungen abzurufen

myapp.bmodel.getApplicationContext().getSharedPreferences("myPrefs_capture_gps_per_hour", Context.MODE_PRIVATE);

Im obigen Code meine App ist ein Objekt der Anwendungsklasse, von der abgeleitet wird Anwendung

Sie benötigen einen Kontext, um Zugriff auf gemeinsame Einstellungen zu erhalten. Der beste Weg ist zu erstellen MyApplication als Nachkomme von Application Klasse, instanziiere dort die preferences und verwenden Sie sie im Rest Ihrer Anwendung als MyApplication.preferences:

public class MyApplication extends Application {
    public static SharedPreferences preferences;

    @Override
    public void onCreate() {
        super.onCreate();

        preferences = getSharedPreferences( getPackageName() + "_preferences", MODE_PRIVATE);

Wenn Sie beispielsweise an anderer Stelle Zugriff auf Ihre Einstellungen benötigen, können Sie dies aufrufen, um Einstellungen zu lesen:

String str = MyApplication.preferences.getString( KEY, DEFAULT );

Oder Sie können dies aufrufen, um etwas in den Einstellungen zu speichern:

MyApplication.preferences.edit().putString( KEY, VALUE ).commit();

(anrufen nicht vergessen commit() nach dem Hinzufügen oder Ändern von Einstellungen!)

  • Dies würde technisch funktionieren, aber warum würden Sie nicht einfach die bereitgestellten verwenden PreferenceManager#getDefaultSharedPreferences(Context context); statische Methode? Genau dafür ist es da.

    – Twaddington

    26. November 2012 um 4:35 Uhr

  • @twaddington solltest du genauer lesen. Meine Antwort ermöglicht den Zugriff auf Einstellungen, wenn context ist nicht verfügbar.

    – Lenik

    26. November 2012 um 5:08 Uhr

  • Sicher, aber er fragt ausdrücklich nach der Verwendung gemeinsamer Einstellungen in einem Activity und ein Servicebeide haben eine Context verfügbar.

    – Twaddington

    26. November 2012 um 5:17 Uhr

  • Es sollte keine Rolle spielen, welchen Kontext Sie bereitstellen, getDefaultSharedPreferences sollte immer dasselbe zurückgeben SharedPreference Beispiel.

    – Twaddington

    26. November 2012 um 6:17 Uhr


  • und muss MyApplication in irgendwelchen Aktivitäten oder so in einer Variablen erstellt werden?

    – Gumuruh

    11. Januar 2021 um 19:19 Uhr

Ja, Shivkumar, Sie können Ihre Freigabeeinstellungen in allen Arten von Diensten so normal verwenden, wie Sie es in Ihrer Aktivität verwenden.

genauso wie

SharedPreferences preferences = getSharedPreferences("<PrefName>",
            MODE_PRIVATE);

Benutzer-Avatar
Nguyen Tan Dat

Es gibt zwei Möglichkeiten, eine Instanz von zu erstellen SharedPreference:

Fall 1:

SharedPreferences preferences = activity.getSharedPreferences("<PrefName>", MODE_PRIVATE);

Fall 2:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this);

Beachten Sie, dass, wenn Sie eine Einstellung mit demselben Namen (Fall 1) oder demselben Kontext (Fall 2) auch an verschiedenen Stellen erstellen, diese immer noch dieselbe ist und offensichtlich Daten gemeinsam nutzen kann.

1109680cookie-checkKann ich Daten von freigegebenen Einstellungen innerhalb eines Dienstes abrufen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy