Wiem, że to stare pytanie, ale chcę się podzielić moim podejściem. Miałem długi czas czytania i korzystałem z kombinacji wspólnych preferencji i globalnej klasy aplikacji:
Klasa aplikacji:
public class ApplicationClass extends Application {
private LocalPreference.Filter filter;
public LocalPreference.Filter getFilter() {
return filter;
}
public void setFilter(LocalPreference.Filter filter) {
this.filter = filter;
}
}
LocalPreference:
public class LocalPreference {
public static void saveLocalPreferences(Activity activity, int maxDistance, int minAge,
int maxAge, boolean showMale, boolean showFemale) {
Filter filter = new Filter();
filter.setMaxDistance(maxDistance);
filter.setMinAge(minAge);
filter.setMaxAge(maxAge);
filter.setShowMale(showMale);
filter.setShowFemale(showFemale);
BabysitApplication babysitApplication = (BabysitApplication) activity.getApplication();
babysitApplication.setFilter(filter);
SecurePreferences securePreferences = new SecurePreferences(activity.getApplicationContext());
securePreferences.edit().putInt(Preference.FILER_MAX_DISTANCE.toString(), maxDistance).apply();
securePreferences.edit().putInt(Preference.FILER_MIN_AGE.toString(), minAge).apply();
securePreferences.edit().putInt(Preference.FILER_MAX_AGE.toString(), maxAge).apply();
securePreferences.edit().putBoolean(Preference.FILER_SHOW_MALE.toString(), showMale).apply();
securePreferences.edit().putBoolean(Preference.FILER_SHOW_FEMALE.toString(), showFemale).apply();
}
public static Filter getLocalPreferences(Activity activity) {
BabysitApplication babysitApplication = (BabysitApplication) activity.getApplication();
Filter applicationFilter = babysitApplication.getFilter();
if (applicationFilter != null) {
return applicationFilter;
} else {
Filter filter = new Filter();
SecurePreferences securePreferences = new SecurePreferences(activity.getApplicationContext());
filter.setMaxDistance(securePreferences.getInt(Preference.FILER_MAX_DISTANCE.toString(), 20));
filter.setMinAge(securePreferences.getInt(Preference.FILER_MIN_AGE.toString(), 15));
filter.setMaxAge(securePreferences.getInt(Preference.FILER_MAX_AGE.toString(), 50));
filter.setShowMale(securePreferences.getBoolean(Preference.FILER_SHOW_MALE.toString(), true));
filter.setShowFemale(securePreferences.getBoolean(Preference.FILER_SHOW_FEMALE.toString(), true));
babysitApplication.setFilter(filter);
return filter;
}
}
public static class Filter {
private int maxDistance;
private int minAge;
private int maxAge;
private boolean showMale;
private boolean showFemale;
public int getMaxDistance() {
return maxDistance;
}
public void setMaxDistance(int maxDistance) {
this.maxDistance = maxDistance;
}
public int getMinAge() {
return minAge;
}
public void setMinAge(int minAge) {
this.minAge = minAge;
}
public int getMaxAge() {
return maxAge;
}
public void setMaxAge(int maxAge) {
this.maxAge = maxAge;
}
public boolean isShowMale() {
return showMale;
}
public void setShowMale(boolean showMale) {
this.showMale = showMale;
}
public boolean isShowFemale() {
return showFemale;
}
public void setShowFemale(boolean showFemale) {
this.showFemale = showFemale;
}
}
}
MainActivity (aktywność, która jest wywoływana jako pierwsza w aplikacji):
LocalPreference.getLocalPreferences(this);
Kroki wyjaśnione:
- Główne działanie wywołuje getLocalPreferences (this) -> to odczyta twoje preferencje, ustawi obiekt filtru w twojej klasie aplikacji i zwróci go.
- Kiedy ponownie wywołujesz funkcję getLocalPreferences () w innym miejscu aplikacji, najpierw sprawdza, czy nie jest ona dostępna w klasie aplikacji, co jest o wiele szybsze.
UWAGA: ZAWSZE sprawdzaj, czy zmienna dotycząca całej aplikacji różni się od NULL, powód -> http://www.developerphil.com/dont-store-data-in-the-application-object/
Obiekt aplikacji nie pozostanie w pamięci na zawsze, zostanie zabity. Wbrew powszechnemu przekonaniu aplikacja nie zostanie ponownie uruchomiona od zera. Android utworzy nowy obiekt Application i rozpocznie działanie, na którym wcześniej znajdował się użytkownik, dając złudzenie, że aplikacja nigdy nie została zabita.
Gdybym nie sprawdzał na null, pozwoliłbym na wyrzucenie nullpointer podczas wywoływania na przykład getMaxDistance () na obiekcie filtru (jeśli obiekt aplikacji został usunięty z pamięci przez Androida)