410 lines
17 KiB
Java
410 lines
17 KiB
Java
/*
|
|
* Copyright (C) 2006 The Android Open Source Project
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
|
|
package android.content;
|
|
|
|
import android.annotation.Nullable;
|
|
|
|
import java.util.Map;
|
|
import java.util.Set;
|
|
|
|
/**
|
|
* Interface for accessing and modifying preference data returned by {@link
|
|
* Context#getSharedPreferences}. For any particular set of preferences,
|
|
* there is a single instance of this class that all clients share.
|
|
* Modifications to the preferences must go through an {@link Editor} object
|
|
* to ensure the preference values remain in a consistent state and control
|
|
* when they are committed to storage. Objects that are returned from the
|
|
* various <code>get</code> methods must be treated as immutable by the application.
|
|
*
|
|
* <p>SharedPreferences is best suited to storing data about how the user prefers
|
|
* to experience the app, for example, whether the user prefers a particular UI theme
|
|
* or whether they prefer viewing particular content in a list vs. a grid. To this end,
|
|
* SharedPreferences reflects changes {@link Editor#commit() committed} or
|
|
* {@link Editor#apply() applied} by {@link Editor}s <em>immediately</em>, potentially
|
|
* before those changes are durably persisted.
|
|
* Under some circumstances such as app crashes or termination these changes may be lost,
|
|
* even if an {@link OnSharedPreferenceChangeListener} reported the change was successful.
|
|
* SharedPreferences is not recommended for storing data that is sensitive to this
|
|
* kind of rollback to a prior state such as user security or privacy settings.
|
|
* For other high-level data persistence options, see
|
|
* <a href="https://d.android.com/room">Room</a> or
|
|
* <a href="https://d.android.com/datastore">DataStore</a>.
|
|
*
|
|
* <p><em>Note:</em> Common implementations guarantee that outstanding edits to preference
|
|
* files are persisted to disk when host Activities become stopped. In some situations
|
|
* (e.g. performing many {@link Editor#commit()} or {@link Editor#apply()}
|
|
* operations just prior to navigating away from the host Activity) this can lead
|
|
* to blocking the main thread during lifecycle transition events and associated
|
|
* ANR errors. For more details see the documentation for {@link Editor#commit()} and
|
|
* {@link Editor#apply()}.
|
|
*
|
|
* <p><em>Note: This class does not support use across multiple processes.</em>
|
|
*
|
|
* <div class="special reference">
|
|
* <h3>Developer Guides</h3>
|
|
* <p>For more information about using SharedPreferences, read the
|
|
* <a href="{@docRoot}guide/topics/data/data-storage.html#pref">Data Storage</a>
|
|
* developer guide.</p></div>
|
|
*
|
|
* @see Context#getSharedPreferences
|
|
*/
|
|
public interface SharedPreferences {
|
|
/**
|
|
* Interface definition for a callback to be invoked when a shared
|
|
* preference is changed.
|
|
*/
|
|
public interface OnSharedPreferenceChangeListener {
|
|
/**
|
|
* Called when a shared preference is changed, added, or removed. This
|
|
* may be called even if a preference is set to its existing value.
|
|
*
|
|
* <p>This callback will be run on your main thread.
|
|
*
|
|
* <p><em>Note: This callback will not be triggered when preferences are cleared
|
|
* via {@link Editor#clear()}, unless targeting {@link android.os.Build.VERSION_CODES#R}
|
|
* on devices running OS versions {@link android.os.Build.VERSION_CODES#R Android R}
|
|
* or later.</em>
|
|
*
|
|
* @param sharedPreferences The {@link SharedPreferences} that received the change.
|
|
* @param key The key of the preference that was changed, added, or removed. Apps targeting
|
|
* {@link android.os.Build.VERSION_CODES#R} on devices running OS versions
|
|
* {@link android.os.Build.VERSION_CODES#R Android R} or later, will receive
|
|
* a {@code null} value when preferences are cleared.
|
|
*/
|
|
void onSharedPreferenceChanged(SharedPreferences sharedPreferences, @Nullable String key);
|
|
}
|
|
|
|
/**
|
|
* Interface used for modifying values in a {@link SharedPreferences}
|
|
* object. All changes you make in an editor are batched, and not copied
|
|
* back to the original {@link SharedPreferences} until you call {@link #commit}
|
|
* or {@link #apply}
|
|
*/
|
|
public interface Editor {
|
|
/**
|
|
* Set a String value in the preferences editor, to be written back once
|
|
* {@link #commit} or {@link #apply} are called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param value The new value for the preference. Passing {@code null}
|
|
* for this argument is equivalent to calling {@link #remove(String)} with
|
|
* this key.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putString(String key, @Nullable String value);
|
|
|
|
/**
|
|
* Set a set of String values in the preferences editor, to be written
|
|
* back once {@link #commit} or {@link #apply} is called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param values The set of new values for the preference. Passing {@code null}
|
|
* for this argument is equivalent to calling {@link #remove(String)} with
|
|
* this key.
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putStringSet(String key, @Nullable Set<String> values);
|
|
|
|
/**
|
|
* Set an int value in the preferences editor, to be written back once
|
|
* {@link #commit} or {@link #apply} are called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param value The new value for the preference.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putInt(String key, int value);
|
|
|
|
/**
|
|
* Set a long value in the preferences editor, to be written back once
|
|
* {@link #commit} or {@link #apply} are called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param value The new value for the preference.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putLong(String key, long value);
|
|
|
|
/**
|
|
* Set a float value in the preferences editor, to be written back once
|
|
* {@link #commit} or {@link #apply} are called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param value The new value for the preference.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putFloat(String key, float value);
|
|
|
|
/**
|
|
* Set a boolean value in the preferences editor, to be written back
|
|
* once {@link #commit} or {@link #apply} are called.
|
|
*
|
|
* @param key The name of the preference to modify.
|
|
* @param value The new value for the preference.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor putBoolean(String key, boolean value);
|
|
|
|
/**
|
|
* Mark in the editor that a preference value should be removed, which
|
|
* will be done in the actual preferences once {@link #commit} is
|
|
* called.
|
|
*
|
|
* <p>Note that when committing back to the preferences, all removals
|
|
* are done first, regardless of whether you called remove before
|
|
* or after put methods on this editor.
|
|
*
|
|
* @param key The name of the preference to remove.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor remove(String key);
|
|
|
|
/**
|
|
* Mark in the editor to remove <em>all</em> values from the
|
|
* preferences. Once commit is called, the only remaining preferences
|
|
* will be any that you have defined in this editor.
|
|
*
|
|
* <p>Note that when committing back to the preferences, the clear
|
|
* is done first, regardless of whether you called clear before
|
|
* or after put methods on this editor.
|
|
*
|
|
* @return Returns a reference to the same Editor object, so you can
|
|
* chain put calls together.
|
|
*/
|
|
Editor clear();
|
|
|
|
/**
|
|
* Commit your preferences changes back from this Editor to the
|
|
* {@link SharedPreferences} object it is editing. This atomically
|
|
* performs the requested modifications, replacing whatever is currently
|
|
* in the SharedPreferences.
|
|
*
|
|
* <p>Note that when two editors are modifying preferences at the same
|
|
* time, the last one to call commit wins.
|
|
*
|
|
* <p>If you don't care about the return value and you're
|
|
* using this from your application's main thread, consider
|
|
* using {@link #apply} instead.
|
|
*
|
|
* @return Returns true if the new values were successfully written
|
|
* to persistent storage.
|
|
*/
|
|
boolean commit();
|
|
|
|
/**
|
|
* Commit your preferences changes back from this Editor to the
|
|
* {@link SharedPreferences} object it is editing. This atomically
|
|
* performs the requested modifications, replacing whatever is currently
|
|
* in the SharedPreferences.
|
|
*
|
|
* <p>Note that when two editors are modifying preferences at the same
|
|
* time, the last one to call apply wins.
|
|
*
|
|
* <p>Unlike {@link #commit}, which writes its preferences out
|
|
* to persistent storage synchronously, {@link #apply}
|
|
* commits its changes to the in-memory
|
|
* {@link SharedPreferences} immediately but starts an
|
|
* asynchronous commit to disk and you won't be notified of
|
|
* any failures. If another editor on this
|
|
* {@link SharedPreferences} does a regular {@link #commit}
|
|
* while a {@link #apply} is still outstanding, the
|
|
* {@link #commit} will block until all async commits are
|
|
* completed as well as the commit itself.
|
|
*
|
|
* <p>As {@link SharedPreferences} instances are singletons within
|
|
* a process, it's safe to replace any instance of {@link #commit} with
|
|
* {@link #apply} if you were already ignoring the return value.
|
|
*
|
|
* <p>You don't need to worry about Android component
|
|
* lifecycles and their interaction with <code>apply()</code>
|
|
* writing to disk. The framework makes sure in-flight disk
|
|
* writes from <code>apply()</code> complete before switching
|
|
* states.
|
|
*
|
|
* <p class='note'>The SharedPreferences.Editor interface
|
|
* isn't expected to be implemented directly. However, if you
|
|
* previously did implement it and are now getting errors
|
|
* about missing <code>apply()</code>, you can simply call
|
|
* {@link #commit} from <code>apply()</code>.
|
|
*/
|
|
void apply();
|
|
}
|
|
|
|
/**
|
|
* Retrieve all values from the preferences.
|
|
*
|
|
* <p>Note that you <em>must not</em> modify the collection returned
|
|
* by this method, or alter any of its contents. The consistency of your
|
|
* stored data is not guaranteed if you do.
|
|
*
|
|
* @return Returns a map containing a list of pairs key/value representing
|
|
* the preferences.
|
|
*
|
|
* @throws NullPointerException
|
|
*/
|
|
Map<String, ?> getAll();
|
|
|
|
/**
|
|
* Retrieve a String value from the preferences.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValue Value to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference value if it exists, or defValue. Throws
|
|
* ClassCastException if there is a preference with this name that is not
|
|
* a String.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
@Nullable
|
|
String getString(String key, @Nullable String defValue);
|
|
|
|
/**
|
|
* Retrieve a set of String values from the preferences.
|
|
*
|
|
* <p>Note that you <em>must not</em> modify the set instance returned
|
|
* by this call. The consistency of the stored data is not guaranteed
|
|
* if you do, nor is your ability to modify the instance at all.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValues Values to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference values if they exist, or defValues.
|
|
* Throws ClassCastException if there is a preference with this name
|
|
* that is not a Set.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
@Nullable
|
|
Set<String> getStringSet(String key, @Nullable Set<String> defValues);
|
|
|
|
/**
|
|
* Retrieve an int value from the preferences.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValue Value to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference value if it exists, or defValue. Throws
|
|
* ClassCastException if there is a preference with this name that is not
|
|
* an int.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
int getInt(String key, int defValue);
|
|
|
|
/**
|
|
* Retrieve a long value from the preferences.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValue Value to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference value if it exists, or defValue. Throws
|
|
* ClassCastException if there is a preference with this name that is not
|
|
* a long.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
long getLong(String key, long defValue);
|
|
|
|
/**
|
|
* Retrieve a float value from the preferences.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValue Value to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference value if it exists, or defValue. Throws
|
|
* ClassCastException if there is a preference with this name that is not
|
|
* a float.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
float getFloat(String key, float defValue);
|
|
|
|
/**
|
|
* Retrieve a boolean value from the preferences.
|
|
*
|
|
* @param key The name of the preference to retrieve.
|
|
* @param defValue Value to return if this preference does not exist.
|
|
*
|
|
* @return Returns the preference value if it exists, or defValue. Throws
|
|
* ClassCastException if there is a preference with this name that is not
|
|
* a boolean.
|
|
*
|
|
* @throws ClassCastException
|
|
*/
|
|
boolean getBoolean(String key, boolean defValue);
|
|
|
|
/**
|
|
* Checks whether the preferences contains a preference.
|
|
*
|
|
* @param key The name of the preference to check.
|
|
* @return Returns true if the preference exists in the preferences,
|
|
* otherwise false.
|
|
*/
|
|
boolean contains(String key);
|
|
|
|
/**
|
|
* Create a new Editor for these preferences, through which you can make
|
|
* modifications to the data in the preferences and atomically commit those
|
|
* changes back to the SharedPreferences object.
|
|
*
|
|
* <p>Note that you <em>must</em> call {@link Editor#commit} to have any
|
|
* changes you perform in the Editor actually show up in the
|
|
* SharedPreferences.
|
|
*
|
|
* @return Returns a new instance of the {@link Editor} interface, allowing
|
|
* you to modify the values in this SharedPreferences object.
|
|
*/
|
|
Editor edit();
|
|
|
|
/**
|
|
* Registers a callback to be invoked when a change happens to a preference.
|
|
*
|
|
* <p class="caution"><strong>Caution:</strong> The preference manager does
|
|
* not currently store a strong reference to the listener. You must store a
|
|
* strong reference to the listener, or it will be susceptible to garbage
|
|
* collection. We recommend you keep a reference to the listener in the
|
|
* instance data of an object that will exist as long as you need the
|
|
* listener.</p>
|
|
*
|
|
* @param listener The callback that will run.
|
|
* @see #unregisterOnSharedPreferenceChangeListener
|
|
*/
|
|
void registerOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
|
|
|
|
/**
|
|
* Unregisters a previous callback.
|
|
*
|
|
* @param listener The callback that should be unregistered.
|
|
* @see #registerOnSharedPreferenceChangeListener
|
|
*/
|
|
void unregisterOnSharedPreferenceChangeListener(OnSharedPreferenceChangeListener listener);
|
|
}
|