SharedPreferences本身一个接口,故无法直接创建其实例。主要负责读取程序的Preferences数据,本身并不提供写入数据的能力,而是通过其内部接口调用.edit()获取对应Editor对象来写入数据。
1、获取SharedPreferences对象
法1:
Context.getSharedPreferences(String name,int mode)
文件名称不存在就会创建一个,操作模式有两种:
- MODE_PRIVATE:默认操作模式,指定该SharedPreferences数据只能被本应用程序读写。
- MODE_MULTI_PRIVATE:用于多个进程共同操作一个SharedPreferences文件。
**注:**android 4.2版本以后不在推荐使用MODE_WORLD_READABLE和MODE_WORLD_WRITEABLE这两种模式, 建议使用ContentProvider。
法2:
Activity.getPreferences(int mode)
当前活动的类名作为SharedPreferences的文件名,底层调用的是下面这个方法
Activity.getSharedPreferences(String name, int mode)
也可以直接调用getSharedPreferences方法,传入自定义的名字。
法3
PreferenceManager.getDefaultSharedPreferences(Context)
当前程序的包名作为前缀来命名SharedPreferences文件
2、获取SharedPreferences.Editor对象。
SharedPreferences.Editor editor = getSharedPreferences(“data”,MODE_PRIVATE).edit();
3、操作数据
editor.putString(“name”,”Lily”); //以键值对形式存储
editor.putInt(“age”,”20”);
editor.putBoolean(“married”,false);
editor.clear(); //清空数据
editor.remove(String key);//删除指定key对用数据
注:SharedOreferences不支持写入Date类型的值。
可使用SimpleDateFormat将Date格式化成字符串后再写入。示例:
SimpleDateFormat sdf=new SimpleDateFormat("yyyy年mm月dd日"+"hh:mm:ss");
//存入当前时间
editor.putString("time",sdf.format(new Date()));
//存入一个随机数
editor.putInt("random",(int)(Math.random()*100));
//提交所有存入的数据
editor.commit();
4、提交数据修改与应用数据的区别
提交:
editor.commit();
- 返回布尔型的值
- 当数据变化进行存储时是一个原子性的操作
- 多个editor同时提交时,只有最后一个生效
应用:
editor.apply();
- 没有返回值
- 原子性操作
- 同时编辑时,也是最后一个生效
两者的区别:
- apply无返回值,而commit返回值可表明是否提交成功
- apply是异步提交到硬件磁盘, 而commit是同步提交到硬件磁盘。故apply比commit效率高。
故不关心提交结果时,建议使用apply。
另:SharedPerferences数据总是保存在/data/data//shared_prefs目录下,以XML格式保存。
5.封装SharedPreferences的工具类示例:
示例1:
public class SharePreferencesUtil {
private static SharePreferencesUtil sSharePreferencesUtil = null;
private static final String DB_NAME = "dbname";
private static final String IS_REMEMBER = "isremember";
...
private static volatile SharedPreferences preferences;
private SharedPreferences.Editor editor;
private SharePreferencesUtil() {
preferences = PreferenceManager.getDefaultSharedPreferences(MyApplication.getContext());
editor = preferences.edit();
}
public static SharePreferencesUtil getInstance() {
if (sSharePreferencesUtil == null) {
synchronized (SharePreferencesUtil.class) {
if (sSharePreferencesUtil == null) {
sSharePreferencesUtil = new SharePreferencesUtil();
}
}
}
return sSharePreferencesUtil;
}
public boolean getIsRemember() {
return preferences.getBoolean(IS_REMEMBER, false);
}
public void setIsRemember(boolean is_remember) {
editor.putBoolean(IS_REMEMBER, is_remember).apply();
}
public String getDbName() {
return preferences.getString(DB_NAME, null);
}
public void setDbName(String db_name) {
editor.putString(DB_NAME, db_name).apply();
}
...
}
示例2:
public class SharedPreferencesUtil{
private SharedPreferences sharedPreferences;
private SharedPreferences.Editor editor;
public SharedPreferencesUtil(Context context,String FILE_NAME) {
sharedPreferences = context.getSharedPreferences(FILE_NAME,
Context.MODE_PRIVATE);
editor = sharedPreferences.edit();
}
//存储 putXXX(String key,xxx value)
public void put(String key, Object object) {
if (object instanceof String) {
editor.putString(key, (String) object);
} else if (object instanceof Integer) {
editor.putInt(key, (Integer) object);
} else if (object instanceof Boolean) {
editor.putBoolean(key, (Boolean) object);
} else if (object instanceof Float) {
editor.putFloat(key, (Float) object);
} else if (object instanceof Long) {
editor.putLong(key, (Long) object);
} else {
editor.putString(key, object.toString());
}
editor.commit();
}
// 获取getXXX(String key,xxx defValue)
public Object getSharedPreference(String key, Object defaultObject) {
if (defaultObject instanceof String) {
return sharedPreferences.getString(key, (String) defaultObject);
} else if (defaultObject instanceof Integer) {
return sharedPreferences.getInt(key, (Integer) defaultObject);
} else if (defaultObject instanceof Boolean) {
return sharedPreferences.getBoolean(key, (Boolean) defaultObject);
} else if (defaultObject instanceof Float) {
return sharedPreferences.getFloat(key, (Float) defaultObject);
} else if (defaultObject instanceof Long) {
return sharedPreferences.getLong(key, (Long) defaultObject);
} else {
return sharedPreferences.getString(key, null);
}
}
//移除remove(String key)
public void remove(String key) {
editor.remove(key);
editor.commit();
}
//清除clear()
public void clear() {
editor.clear();
editor.commit();
}
// 查询contain(String key)
public Boolean contain(String key) {
return sharedPreferences.contains(key);
}
// 返回所有getAll()
public Map<String, ?> getAll() {
return sharedPreferences.getAll();
}
}
应用示例:
示例1:(项目代码较多)
public class LoginActivity extends BaseProcessActivity implements View.OnClickListener {
private CheckBox rememberPwdCB;
private EditText userEditText;
private EditText pwdEditText;
private Button enterButton;
...
ViewTools mViewTools;
SharePreferencesUtil preferencesUtil = SharePreferencesUtil.getInstance();
private String dbname="";
private String dbpassword="";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
ButterKnife.bind(this);
//解決彈出軟鍵盤時編輯框被覆蓋的問題
AndroidBug5497Workaround.assistActivity(findViewById(android.R.id.content));
if (Build.VERSION.SDK_INT >= 23) {
if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) !=
PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 1);
}
if (ContextCompat.checkSelfPermission(this,
Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_EXTERNAL_STORAGE,
Manifest.permission.READ_EXTERNAL_STORAGE}, 1);
}
}
mViewTools = new ViewTools(this);
initView();
...
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
switch (requestCode) {
case 1:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
return;
} else {
this.finish();
Process.killProcess(Process.myPid());
}
break;
default:
}
}
private void initView() {
rememberPwdCB = findViewById(R.id.rememberPwdCheckBox);
userEditText = findViewById(R.id.userEditText);
pwdEditText = findViewById(R.id.pwdEditText);
enterButton = findViewById(R.id.enterButton);
...
enterButton.setOnClickListener(this);
rememberPwdCB.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
preferencesUtil.setIsRemember(isChecked);
}
});
rememberPwdCB.setChecked(preferencesUtil.getIsRemember());
if (rememberPwdCB.isChecked()) {
userEditText.setText(preferencesUtil.getNoId());
pwdEditText.setText(preferencesUtil.getPwdId());
}
mViewTools.setETEnabled(userEditText, true);
mViewTools.showSoftInput(userEditText);
userEditText.addTextChangedListener(mTextWatcher);
pwdEditText.addTextChangedListener(mTextWatcher);
}
TextWatcher mTextWatcher = new TextWatcher() {
@Override
public void beforeTextChanged(CharSequence s, int start, int count, int after) {
}
@Override
public void onTextChanged(CharSequence s, int start, int before, int count) {
String id = userEditText.getText().toString();
String pwd = pwdEditText.getText().toString();
if (!id.isEmpty()) {
if (userEditText.getText().toString().substring(id.length() - 1).equals("\n")) {
userEditText.clearFocus();
userEditText.setText(id.substring(0, id.length() - 1));
pwdEditText.requestFocus();
pwdEditText.setSelection(pwd.length());
mViewTools.showSoftInput(pwdEditText);
}
}
if (!pwd.isEmpty()) {
if (pwdEditText.getText().toString().substring(pwd.length() - 1).equals("\n")) {
pwdEditText.setText(pwd.substring(0, pwd.length() - 1));
mViewTools.hideSoftInput(pwdEditText);
pwdEditText.clearFocus();
enterButton.requestFocus();
}
}
}
@Override
public void afterTextChanged(Editable s) {
}
};
@Override
public void onWindowFocusChanged(boolean hasFocus) {
super.onWindowFocusChanged(hasFocus);
if (hasFocus && Build.VERSION.SDK_INT >= 19) {
View decorView = getWindow().getDecorView();
decorView.setSystemUiVisibility(View.SYSTEM_UI_FLAG_LAYOUT_STABLE
| View.SYSTEM_UI_FLAG_LAYOUT_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_LAYOUT_FULLSCREEN
| View.SYSTEM_UI_FLAG_HIDE_NAVIGATION
| View.SYSTEM_UI_FLAG_FULLSCREEN
| View.SYSTEM_UI_FLAG_IMMERSIVE_STICKY);
}
}
...
/**
* Called when a view has been clicked.
*
* @param v The view that was clicked.
*/
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.enterButton:
//TabActivity.actionStart(LoginActivity.this);
final String id = userEditText.getText().toString().trim();
final String pwd = pwdEditText.getText().toString().trim();
if ((id == null || id.trim().equals(""))) {
userEditText.setError("請輸入帳號!");
if (pwd == null || pwd.trim().equals("")) {
pwdEditText.setError("請輸入密碼!");
return;
}
return;
} else {
if (pwd == null || pwd.trim().equals("")) {
pwdEditText.setError("請輸入密碼!");
return;
}
}
showProcessDialog("登錄中...");
...
}
}
@Override
public void onDestroy() {
super.onDestroy();
mHandler.removeCallbacksAndMessages(null);//finish之后 消息仍然存在消息队列中,最好把他们移除
}
...
public static void actionStart(Context context) {
Intent intent = new Intent(context, LoginActivity.class);
context.startActivity(intent);
}
}
示例2:
public class LoginActivity extends Activity implements OnClickListener {
private EditText username;
private EditText password;
private Button login;
private CheckBox holdPwd;
private MyDialog mydialog;
private SharedPreferencesUtil sharedPreferencesUtil;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_login);
init();
}
private void init() {
sharedPreferencesUtil= new SharedPreferencesUtil(
LoginActivity.this, "test");
username = (EditText) findViewById(R.id.username);
password = (EditText) findViewById(R.id.password);
holdPwd = (CheckBox) findViewById(R.id.login_hold);
holdPwd.setChecked(true);
username.setText(sharedPreferencesUtil.getSharedPreference("username", "").toString().trim()); password.setText(sharedPreferencesUtil.getSharedPreference("password", "").toString().trim());
login = (Button) findViewById(R.id.login);
login.setOnClickListener(this);
}
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.login:
String name = username.getText().toString().trim();
String pwd = password.getText().toString().trim();
if (holdPwd.isChecked()) {
sharedPreferencesUtil.put("username", name);
sharedPreferencesUtil.put("password", pwd);
sharedPreferencesUtil.put("isremember", holdPwd.isChecked());
} else {
sharedPreferencesUtil.remove("username");
sharedPreferencesUtil.remove("password");
sharedPreferencesUtil.remove("isremember");
}
Intent intent = new Intent(LoginActivity.this, MainActivity.class);
startActivity(intent);
finish();
break;
...
}
}
}