1、Settings
Settings主要要三个了System,Global和Secure来保存设置的值

System-putString保存值
保存数据是,先判断设置的数据key值是否在MOVED_TO_SECURE、MOVED_TO_GLOBAL或者MOVED_TO_SECURE_THEN_GLOBAL数组中,如果在则直接返回false.如果存在则调用sNameValueCache.putStringForUser(resolver, name, value, null, false, userHandle)保存数据。
源码:
public static boolean putString(ContentResolver resolver, String name, String value) {
return putStringForUser(resolver, name, value, resolver.getUserId());
}
/** @hide */
public static boolean putStringForUser(ContentResolver resolver, String name, String value,
int userHandle) {
if (MOVED_TO_SECURE.contains(name)) {
Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
+ " to android.provider.Settings.Secure, value is unchanged.");
return false;
}
if (MOVED_TO_GLOBAL.contains(name) || MOVED_TO_SECURE_THEN_GLOBAL.contains(name)) {
Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.System"
+ " to android.provider.Settings.Global, value is unchanged.");
return false;
}
return sNameValueCache.putStringForUser(resolver, name, value, null, false, userHandle);
}
继续分析NameValueCache的putStringForUser
public boolean putStringForUser(ContentResolver cr, String name, String value,
String tag, boolean makeDefault, final int userHandle) {
try {
Bundle arg = new Bundle();
arg.putString(Settings.NameValueTable.VALUE, value);
arg.putInt(CALL_METHOD_USER_KEY, userHandle);
if (tag != null) {
arg.putString(CALL_METHOD_TAG_KEY, tag);
}
if (makeDefault) {
arg.putBoolean(CALL_METHOD_MAKE_DEFAULT_KEY, true);
}
IContentProvider cp = mProviderHolder.getProvider(cr);
cp.call(cr.getPackageName(), mCallSetCommand, name, arg);
} catch (RemoteException e) {
Log.w(TAG, "Can't set key " + name + " in " + mUri, e);
return false;
}
return true;
}
通过ContentProvider写入数据,保存在settings_system.xml中
Secure.putString
secure putString时检查name是否在LOCATION_MODE数组中,如果在则调用setLocationModeForUser保存数据,如果
在MOVED_TO_GLOBAL则调用Global的putString,否则调用NameValueCache的putStringForUser。
public static boolean putString(ContentResolver resolver, String name, String value) {
return putStringForUser(resolver, name, value, resolver.getUserId());
}
/** @hide */
public static boolean putStringForUser(ContentResolver resolver, String name, String value,
int userHandle) {
return putStringForUser(resolver, name, value, null, false, userHandle);
}
/** @hide */
public static boolean putStringForUser(@NonNull ContentResolver resolver,
@NonNull String name, @Nullable String value, @Nullable String tag,
boolean makeDefault, @UserIdInt int userHandle) {
if (LOCATION_MODE.equals(name)) {
// Map LOCATION_MODE to underlying location provider storage API
return setLocationModeForUser(resolver, Integer.parseInt(value), userHandle);
}
if (MOVED_TO_GLOBAL.contains(name)) {
Log.w(TAG, "Setting " + name + " has moved from android.provider.Settings.Secure"
+ " to android.provider.Settings.Global");
return Global.putStringForUser(resolver, name, value,
tag, makeDefault, userHandle);
}
return sNameValueCache.putStringForUser(resolver, name, value, tag,
makeDefault, userHandle);
}

通过ContentProvider写入数据,保存在settings_secure.xml中


3152

被折叠的 条评论
为什么被折叠?



