1 /* 2 * Copyright (C) 2006 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 package android.content; 18 19 import android.annotation.Nullable; 20 21 import java.util.Map; 22 import java.util.Set; 23 24 /** 25 * Interface for accessing and modifying preference data returned by {@link 26 * Context#getSharedPreferences}. For any particular set of preferences, 27 * there is a single instance of this class that all clients share. 28 * Modifications to the preferences must go through an {@link Editor} object 29 * to ensure the preference values remain in a consistent state and control 30 * when they are committed to storage. Objects that are returned from the 31 * various <code>get</code> methods must be treated as immutable by the application. 32 * 33 * <p>Note: This class provides strong consistency guarantees. It is using expensive operations 34 * which might slow down an app. Frequently changing properties or properties where loss can be 35 * tolerated should use other mechanisms. For more details read the comments on 36 * {@link Editor#commit()} and {@link Editor#apply()}. 37 * 38 * <p><em>Note: This class does not support use across multiple processes.</em> 39 * 40 * <div class="special reference"> 41 * <h3>Developer Guides</h3> 42 * <p>For more information about using SharedPreferences, read the 43 * <a href="{@docRoot}guide/topics/data/data-storage.html#pref">Data Storage</a> 44 * developer guide.</p></div> 45 * 46 * @see Context#getSharedPreferences 47 */ 48 public interface SharedPreferences { 49 /** 50 * Interface definition for a callback to be invoked when a shared 51 * preference is changed. 52 */ 53 public interface OnSharedPreferenceChangeListener { 54 /** 55 * Called when a shared preference is changed, added, or removed. This 56 * may be called even if a preference is set to its existing value. 57 * 58 * <p>This callback will be run on your main thread. 59 * 60 * <p><em>Note: This callback will not be triggered when preferences are cleared 61 * via {@link Editor#clear()}, unless targeting {@link android.os.Build.VERSION_CODES#R} 62 * on devices running OS versions {@link android.os.Build.VERSION_CODES#R Android R} 63 * or later.</em> 64 * 65 * @param sharedPreferences The {@link SharedPreferences} that received the change. 66 * @param key The key of the preference that was changed, added, or removed. Apps targeting 67 * {@link android.os.Build.VERSION_CODES#R} on devices running OS versions 68 * {@link android.os.Build.VERSION_CODES#R Android R} or later, will receive 69 * a {@code null} value when preferences are cleared. 70 */ onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key)71 void onSharedPreferenceChanged(SharedPreferences sharedPreferences, String key); 72 } 73 74 /** 75 * Interface used for modifying values in a {@link SharedPreferences} 76 * object. All changes you make in an editor are batched, and not copied 77 * back to the original {@link SharedPreferences} until you call {@link #commit} 78 * or {@link #apply} 79 */ 80 public interface Editor { 81 /** 82 * Set a String value in the preferences editor, to be written back once 83 * {@link #commit} or {@link #apply} are called. 84 * 85 * @param key The name of the preference to modify. 86 * @param value The new value for the preference. Passing {@code null} 87 * for this argument is equivalent to calling {@link #remove(String)} with 88 * this key. 89 * 90 * @return Returns a reference to the same Editor object, so you can 91 * chain put calls together. 92 */ putString(String key, @Nullable String value)93 Editor putString(String key, @Nullable String value); 94 95 /** 96 * Set a set of String values in the preferences editor, to be written 97 * back once {@link #commit} or {@link #apply} is called. 98 * 99 * @param key The name of the preference to modify. 100 * @param values The set of new values for the preference. Passing {@code null} 101 * for this argument is equivalent to calling {@link #remove(String)} with 102 * this key. 103 * @return Returns a reference to the same Editor object, so you can 104 * chain put calls together. 105 */ putStringSet(String key, @Nullable Set<String> values)106 Editor putStringSet(String key, @Nullable Set<String> values); 107 108 /** 109 * Set an int value in the preferences editor, to be written back once 110 * {@link #commit} or {@link #apply} are called. 111 * 112 * @param key The name of the preference to modify. 113 * @param value The new value for the preference. 114 * 115 * @return Returns a reference to the same Editor object, so you can 116 * chain put calls together. 117 */ putInt(String key, int value)118 Editor putInt(String key, int value); 119 120 /** 121 * Set a long value in the preferences editor, to be written back once 122 * {@link #commit} or {@link #apply} are called. 123 * 124 * @param key The name of the preference to modify. 125 * @param value The new value for the preference. 126 * 127 * @return Returns a reference to the same Editor object, so you can 128 * chain put calls together. 129 */ putLong(String key, long value)130 Editor putLong(String key, long value); 131 132 /** 133 * Set a float value in the preferences editor, to be written back once 134 * {@link #commit} or {@link #apply} are called. 135 * 136 * @param key The name of the preference to modify. 137 * @param value The new value for the preference. 138 * 139 * @return Returns a reference to the same Editor object, so you can 140 * chain put calls together. 141 */ putFloat(String key, float value)142 Editor putFloat(String key, float value); 143 144 /** 145 * Set a boolean value in the preferences editor, to be written back 146 * once {@link #commit} or {@link #apply} are called. 147 * 148 * @param key The name of the preference to modify. 149 * @param value The new value for the preference. 150 * 151 * @return Returns a reference to the same Editor object, so you can 152 * chain put calls together. 153 */ putBoolean(String key, boolean value)154 Editor putBoolean(String key, boolean value); 155 156 /** 157 * Mark in the editor that a preference value should be removed, which 158 * will be done in the actual preferences once {@link #commit} is 159 * called. 160 * 161 * <p>Note that when committing back to the preferences, all removals 162 * are done first, regardless of whether you called remove before 163 * or after put methods on this editor. 164 * 165 * @param key The name of the preference to remove. 166 * 167 * @return Returns a reference to the same Editor object, so you can 168 * chain put calls together. 169 */ remove(String key)170 Editor remove(String key); 171 172 /** 173 * Mark in the editor to remove <em>all</em> values from the 174 * preferences. Once commit is called, the only remaining preferences 175 * will be any that you have defined in this editor. 176 * 177 * <p>Note that when committing back to the preferences, the clear 178 * is done first, regardless of whether you called clear before 179 * or after put methods on this editor. 180 * 181 * @return Returns a reference to the same Editor object, so you can 182 * chain put calls together. 183 */ clear()184 Editor clear(); 185 186 /** 187 * Commit your preferences changes back from this Editor to the 188 * {@link SharedPreferences} object it is editing. This atomically 189 * performs the requested modifications, replacing whatever is currently 190 * in the SharedPreferences. 191 * 192 * <p>Note that when two editors are modifying preferences at the same 193 * time, the last one to call commit wins. 194 * 195 * <p>If you don't care about the return value and you're 196 * using this from your application's main thread, consider 197 * using {@link #apply} instead. 198 * 199 * @return Returns true if the new values were successfully written 200 * to persistent storage. 201 */ commit()202 boolean commit(); 203 204 /** 205 * Commit your preferences changes back from this Editor to the 206 * {@link SharedPreferences} object it is editing. This atomically 207 * performs the requested modifications, replacing whatever is currently 208 * in the SharedPreferences. 209 * 210 * <p>Note that when two editors are modifying preferences at the same 211 * time, the last one to call apply wins. 212 * 213 * <p>Unlike {@link #commit}, which writes its preferences out 214 * to persistent storage synchronously, {@link #apply} 215 * commits its changes to the in-memory 216 * {@link SharedPreferences} immediately but starts an 217 * asynchronous commit to disk and you won't be notified of 218 * any failures. If another editor on this 219 * {@link SharedPreferences} does a regular {@link #commit} 220 * while a {@link #apply} is still outstanding, the 221 * {@link #commit} will block until all async commits are 222 * completed as well as the commit itself. 223 * 224 * <p>As {@link SharedPreferences} instances are singletons within 225 * a process, it's safe to replace any instance of {@link #commit} with 226 * {@link #apply} if you were already ignoring the return value. 227 * 228 * <p>You don't need to worry about Android component 229 * lifecycles and their interaction with <code>apply()</code> 230 * writing to disk. The framework makes sure in-flight disk 231 * writes from <code>apply()</code> complete before switching 232 * states. 233 * 234 * <p class='note'>The SharedPreferences.Editor interface 235 * isn't expected to be implemented directly. However, if you 236 * previously did implement it and are now getting errors 237 * about missing <code>apply()</code>, you can simply call 238 * {@link #commit} from <code>apply()</code>. 239 */ apply()240 void apply(); 241 } 242 243 /** 244 * Retrieve all values from the preferences. 245 * 246 * <p>Note that you <em>must not</em> modify the collection returned 247 * by this method, or alter any of its contents. The consistency of your 248 * stored data is not guaranteed if you do. 249 * 250 * @return Returns a map containing a list of pairs key/value representing 251 * the preferences. 252 * 253 * @throws NullPointerException 254 */ getAll()255 Map<String, ?> getAll(); 256 257 /** 258 * Retrieve a String value from the preferences. 259 * 260 * @param key The name of the preference to retrieve. 261 * @param defValue Value to return if this preference does not exist. 262 * 263 * @return Returns the preference value if it exists, or defValue. Throws 264 * ClassCastException if there is a preference with this name that is not 265 * a String. 266 * 267 * @throws ClassCastException 268 */ 269 @Nullable getString(String key, @Nullable String defValue)270 String getString(String key, @Nullable String defValue); 271 272 /** 273 * Retrieve a set of String values from the preferences. 274 * 275 * <p>Note that you <em>must not</em> modify the set instance returned 276 * by this call. The consistency of the stored data is not guaranteed 277 * if you do, nor is your ability to modify the instance at all. 278 * 279 * @param key The name of the preference to retrieve. 280 * @param defValues Values to return if this preference does not exist. 281 * 282 * @return Returns the preference values if they exist, or defValues. 283 * Throws ClassCastException if there is a preference with this name 284 * that is not a Set. 285 * 286 * @throws ClassCastException 287 */ 288 @Nullable getStringSet(String key, @Nullable Set<String> defValues)289 Set<String> getStringSet(String key, @Nullable Set<String> defValues); 290 291 /** 292 * Retrieve an int value from the preferences. 293 * 294 * @param key The name of the preference to retrieve. 295 * @param defValue Value to return if this preference does not exist. 296 * 297 * @return Returns the preference value if it exists, or defValue. Throws 298 * ClassCastException if there is a preference with this name that is not 299 * an int. 300 * 301 * @throws ClassCastException 302 */ getInt(String key, int defValue)303 int getInt(String key, int defValue); 304 305 /** 306 * Retrieve a long value from the preferences. 307 * 308 * @param key The name of the preference to retrieve. 309 * @param defValue Value to return if this preference does not exist. 310 * 311 * @return Returns the preference value if it exists, or defValue. Throws 312 * ClassCastException if there is a preference with this name that is not 313 * a long. 314 * 315 * @throws ClassCastException 316 */ getLong(String key, long defValue)317 long getLong(String key, long defValue); 318 319 /** 320 * Retrieve a float value from the preferences. 321 * 322 * @param key The name of the preference to retrieve. 323 * @param defValue Value to return if this preference does not exist. 324 * 325 * @return Returns the preference value if it exists, or defValue. Throws 326 * ClassCastException if there is a preference with this name that is not 327 * a float. 328 * 329 * @throws ClassCastException 330 */ getFloat(String key, float defValue)331 float getFloat(String key, float defValue); 332 333 /** 334 * Retrieve a boolean value from the preferences. 335 * 336 * @param key The name of the preference to retrieve. 337 * @param defValue Value to return if this preference does not exist. 338 * 339 * @return Returns the preference value if it exists, or defValue. Throws 340 * ClassCastException if there is a preference with this name that is not 341 * a boolean. 342 * 343 * @throws ClassCastException 344 */ getBoolean(String key, boolean defValue)345 boolean getBoolean(String key, boolean defValue); 346 347 /** 348 * Checks whether the preferences contains a preference. 349 * 350 * @param key The name of the preference to check. 351 * @return Returns true if the preference exists in the preferences, 352 * otherwise false. 353 */ contains(String key)354 boolean contains(String key); 355 356 /** 357 * Create a new Editor for these preferences, through which you can make 358 * modifications to the data in the preferences and atomically commit those 359 * changes back to the SharedPreferences object. 360 * 361 * <p>Note that you <em>must</em> call {@link Editor#commit} to have any 362 * changes you perform in the Editor actually show up in the 363 * SharedPreferences. 364 * 365 * @return Returns a new instance of the {@link Editor} interface, allowing 366 * you to modify the values in this SharedPreferences object. 367 */ edit()368 Editor edit(); 369 370 /** 371 * Registers a callback to be invoked when a change happens to a preference. 372 * 373 * <p class="caution"><strong>Caution:</strong> The preference manager does 374 * not currently store a strong reference to the listener. You must store a 375 * strong reference to the listener, or it will be susceptible to garbage 376 * collection. We recommend you keep a reference to the listener in the 377 * instance data of an object that will exist as long as you need the 378 * listener.</p> 379 * 380 * @param listener The callback that will run. 381 * @see #unregisterOnSharedPreferenceChangeListener 382 */ registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)383 void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener); 384 385 /** 386 * Unregisters a previous callback. 387 * 388 * @param listener The callback that should be unregistered. 389 * @see #registerOnSharedPreferenceChangeListener 390 */ unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener)391 void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener); 392 } 393