SharedPreferences kontekst aplikacji a kontekst aktywności

Używam kilku SharedPreferences do przechowywania danych w mojej aplikacji. Niektóre preferencje są używane w wielu aktywnościach.

Wiem, że SharedPreferences są wewnętrznie wspierane przez mapę szybkiego dostępu do odczytu i zapisywane na karcie SD po zmianie ustawień.

Zastanawiam się, która droga jest lepsza, jeśli sharedpreference jest dostępny przez wiele activies:

  1. Utwórz instancję w każdej aktywności, używając kontekstu aktywności.
  2. tworzy ją w każdej aktywności, ale używając kontekst aplikacji.
  3. umieść go np. w klasie aplikacji i utwórz instancję tylko raz, podobnie jak singleton.

Jeśli użyję 1. rozwiązanie czy istnieje obiekt sharedpreference dla każdej aktywności? A czy wewnętrzna Mapa sharedpreference zostanie zniszczona, gdy aktywność zostanie zniszczona?

Jeśli użyję 2. rozwiązanie czy w każdej czynności będzie tylko jedna instancja, chociaż nazwę getSharedPreferences? I czy wewnętrzna mapa będzie w pamięci tak długo, jak długo aplikacja żyje?

Mam nadzieję, że ktoś wie, jak Android radzi sobie z tym wewnętrznie.

Author: Brian Tompsett - 汤莱恩, 2012-07-19

3 answers

Warto przejrzeć źródła , które pokazują, że instancja Context (czy to instancja Activity Czy Application) ma tę samą mapę statyczną HashMap<String, SharedPreferencesImpl>.

Więc za każdym razem, gdy żądasz instancji {[4] } o tej samej nazwie poprzez Context.getSharedPreferences(name, mode), otrzymujesz tę samą instancję, ponieważ najpierw sprawdza ona, czy mapa zawiera już instancję SharedPreferences dla klucza (która jest przekazaną nazwą). Po załadowaniu instancji SharedPreferences nie zostanie ona ponownie załadowana, lecz pobrana z mapy.

Więc faktycznie nie ważne jest, aby używać tej samej nazwy, aby uzyskać te same prefs z różnych części aplikacji. Jednak stworzenie jednego "punktu dostępu" dla prefs może być plusem. Więc może to być wrapper singleton nad prefs utworzonym w Application.onCreate().

 63
Author: Vit Khudenko,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 19:20:21

SharedPreferences są zarządzane wewnętrznie przez Androida jako singletony. Możesz uzyskać tyle instancji, ile chcesz za pomocą:

context.getSharedPreferences(name, mode);

Tak długo, jak używasz tej samej nazwy , zawsze otrzymujesz tę samą instancję . Dlatego nie ma problemów z współbieżnością.

 11
Author: David Wasser,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-07-19 19:05:57

Preferuję użycie klasy singleton dla preferencji, zainicjalizuj preferencje raz przez kontekst aplikacji . twórz metody getter i setter (get/put), aby dodawać, aktualizować i usuwać dane.

W ten sposób stworzy instancję raz i może być bardziej czytelna,wielokrotnego użytku.

 8
Author: AAnkit,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-05-07 15:47:52