30

Ich entwickle eine Android-Anwendung. Ich benutze Android 2.2Kann ich Daten aus freigegebenen Einstellungen in einem Service abrufen?

In meiner Anwendung erfassen ich GPS-Daten und senden sie an den Dienst mit der 1 Stunde Zeitintervall. Wenn der Benutzer die Anwendung verlässt, funktioniert es auch (es ist erforderlich).

Ich benutze 2 Dienste (benutzerdefiniert), eine für die Erfassung von GPS-Daten und andere zum Senden an den Server.

Hier meine Zweifel

  • In-Service, können wir gemeinsame Vorlieben verwenden.

  • Wenn wir Daten in freigegebenen Einstellungen in einer beliebigen Aktivität der Anwendung speichern, können wir dann diese Daten mit Hilfe von gemeinsamen Voreinstellungen verwenden?

+0

Beste Antwort hier gefunden http://stackoverflow.com/questions/6446221/get-context-in-a-service?lq=1 –

Antwort

11


Ich finde die Lösung.
Innerhalb eines Service, den wir die folgende Methode aufrufen

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


In dem obigen Code, um die gemeinsamen Vorlieben zu bekommen myapp ist eine Aufgabe der Anwendungsklasse, die von Anwendung stammt

7

Sie benötigen einen Kontext, um Zugriff auf gemeinsame Einstellungen zu erhalten. Der beste Weg ist MyApplication als Nachkomme Application Klasse zu erstellen, instanziiert dort die preferences und sich in dem Rest der 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); 

Zum Beispiel, wenn Sie den Zugriff auf Ihre Einstellungen müssen woanders, Sie können diese Einstellungen zu lesen, rufen:

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

Oder Sie nennen dies etwas zu den Einstellungen zu speichern:

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

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

+2

Das würde technisch funktionieren, aber warum würden Sie nicht einfach den mitgelieferten PreferenceManager verwenden #getDefaultSharedPreferences (Kontextkontext); 'statische Methode? Genau dafür ist es da. – twaddington

+1

@twaddington sollten Sie genauer lesen. Meine Antwort erlaubt den Zugriff auf Einstellungen, wenn "Kontext" ** nicht ** verfügbar ist. – lenik

+2

Sicher, aber er fragt speziell nach gemeinsamen Präferenzen in einer 'Activity' und einem' Service', die beide einen 'Context' zur Verfügung haben. – twaddington

5

Ja Shivkumar Sie Ihren Anteil Vorlieben in jeder Art von Dienstleistungen wie gewohnt verwenden können, wie Sie in Ihrer Aktivität verwenden.

gleiche wie

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

Einfach! Ähnlich für getResources, getString, etc ... Die IntentService-Klasse erbt von Context. –

35

Sie können die Standard gemeinsamen Präferenzen zugreifen Instanz, die über alle Ihre Activity und Service Klassen geteilt wird, durch PreferenceManager.getDefaultSharedPreferences(Context context) Aufruf:

SharedPreferences preferences = PreferenceManager.getDefaultSharedPreferences(this); 

Dieser große ist einfach für die Speicherung Primitive (wie Booleans) oder serialisierbare Objekte. Wenn Sie jedoch viele Standortdaten erfassen, sollten Sie stattdessen eine SQLite-Datenbank verwenden.

+1

Diese Antwort kombiniert damit: Der Kontext innerhalb des Dienstes wird nicht sichtbar bis onStart oder onStartCommand in Diensten: http://StackOverflow.com/Questions/7619917/How-to-get-context-in-android-service-class löste das für mich. – class

+0

Sie können stattdessen immer das Ergebnis der 'getApplicationContext()' Methode des Service übergeben. – twaddington

+0

@twaddington Also, wenn wir 'getSharedPreferences (String, Context) verwenden' würden die Einstellungen nicht geteilt werden? – Sohaib

1

Es gibt zwei Möglichkeiten Instanz SharedPreference zu erstellen:

Fall 1:

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

Fall 2:

SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); 

Hinweis, wenn Sie eine Präferenz mit dem gleichen Namen (Fall 1) oder gleichem Kontext (Fall 2) auch an verschiedenen Stellen schaffen, es ist immer noch das gleiche, und kann teilen Sie Daten offensichtlich.