I am using several SharedPreferences to store data in my app.
Some preferences are used in a lot of activites.
I know that the SharedPreferences are internally backed by a map for fast read-access and written to sdcard when settings are changed.
I wonder which way is better if a sharedpreference is accessed by a lot of activies:
- Instantiate it in every activity using the activity context.
- Instantiate it in every activity, but using the application context.
- Put it in e.g. the Application class and instantiate it only once there, similar to a singleton.
If I use 1. solution is there a sharedpreference object for every activity? And will the sharedpreference’s internal map get destroyed when the activity is destroyed?
If I use 2. solution will there be only one instance although I call getSharedPreferences in every activity? And will the internal map be in memory as long as the application is alive?
Hopefully someone knows how Android handles it internally.
It is worth reviewing the sources that show that a
Contextinstance (be it anActivityor anApplicationinstance) share the same static mapHashMap<String, SharedPreferencesImpl>.So whenever you request an instance of
SharedPreferencesby the same name viaContext.getSharedPreferences(name, mode)you get the same instance since it first checks if the map already containsSharedPreferencesinstance for a key (which is the passed name). OnceSharedPreferencesinstance is loaded it will not be loaded again, but taken from the map instead.So it actually does not matter which way you go, the important thing is to use the same name in order to get the same prefs from different parts of the application. However creating a single “access point” for the prefs could be a plus. So it could be a singleton wrapper over the prefs instantiated in
Application.onCreate().