1.SharedPreferences 本身是一个接口,程序无法直接创建SharedPreferences实例,只能通过Context提供的getSharedPreferences(String name,int mode)来获取该实例
该方法的第二个参数可以设置模式有:
(1).Context.MODE_PRIVATE:指定该SharedPreferences数据只能被应用程序读写
(2).Context.MODE_WORLD_READABLE:指定该SharedPreferences数据能被其他应用程序读,但不能写。
(3).Context,MODE_WORLD_WRITEABLE:指定该SharedPreferences数据能被其他应用程序读写。
从android 4.2 模式(2)、(3)就不再推荐使用。
public class LoginActivity extends AppCompatActivity implements CompoundButton.OnCheckedChangeListener {
// SharedPreferences 使用规则:
// 1. 存储方式:保存到文件中
// 2. 存储格式: Key-Value
// 3. 存储内容: 不要过长,精简的
// 4. 应用场景: 配置字段、用户信息、
private EditText mTxtName;
private EditText mTxtPass;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
mTxtName = (EditText) findViewById(R.id.txt_name);
mTxtPass = (EditText) findViewById(R.id.txt_pass);
// 1. SharedPreferences 在使用的时候,应该先看一下是否保存过数据
SharedPreferences sp =
getSharedPreferences("app", MODE_PRIVATE);
// 3.监测是否有记住密码的功能,同时设置 CheckBox的状态变化
CheckBox chbRememberPass = (CheckBox) findViewById(R.id.chb_remember_pass);
boolean rp = sp.getBoolean("rememberPass", false);
chbRememberPass.setChecked(rp);
chbRememberPass.setOnCheckedChangeListener(this);
if(rp) {
// 2. 使用 getXxxx(String key, ..defaultValue)
String name = sp.getString("name", null);
String pass = sp.getString("pass", null);
mTxtName.setText(name);
mTxtPass.setText(pass);
}
}
public void btnLogin(View view) {
SharedPreferences sp = getSharedPreferences("app", MODE_PRIVATE);
// 保存配置到 SharedPreferences
SharedPreferences.Editor editor = sp.edit();
// 添加内容到存储区
editor.putString("name", mTxtName.getText().toString());
editor.putString("pass", mTxtPass.getText().toString());
// Editor 必须要 提交 可以使用commit() 或者 apply() (API 9以上)
editor.apply();
Intent intent = new Intent(this, MainActivity.class);
startActivity(intent);
}
@Override
public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
SharedPreferences sp = getSharedPreferences("app", MODE_PRIVATE);
SharedPreferences.Editor editor = sp.edit();
if(isChecked){
editor.putBoolean("rememberPass", true);
}else{
editor.remove("rememberPass");
}
editor.apply();
}
}
2.android的File存储:Context提供了两个方法来打开应用程序的数据文件里的文件IO流
(1).FileInputStream openFileInput(String name): 打开应用程序的数据文件夹下的name文件对应的输入流
(2).FileOutputStream openFileOutput(String name,int mode):打开应用程序的数据文件夹下的那么文件对应的输出流
<1>MODE_PRIVATE: 该文件只能被当前程序读写
<2>MODE_APPEND:以追加的方式打开该文件,应用程序可以向该文件中追加内容。
<3>MODE_WORLD_READABLE:该文件的内容可以被其他程序读取
<4>MODE_WORLD_WRITEABLE:该文件的内容可以被其他程序读写
android 4.2开始<3>、<4>不再推荐使用
3.读写SD卡上的文件
(1).Environment.getExternalStorageState();// 1. 监测当前手机是否包含存储卡, 所有外部存储的操作都需要在清单文件声明权限
(2).Environment.getExternalStorageDirectory(); 获取SD卡的目录
public class ExternalActivity extends AppCompatActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_external);
testSdcard();
}
public void testSdcard() {
// 1. 监测当前手机是否包含存储卡,
// 所有外部存储的操作都需要在清单文件声明权限
String state = Environment.getExternalStorageState();
// 根据状态判断是否有外部存储
if (Environment.MEDIA_MOUNTED.equals(state)) {
// 外部存储已经挂载,可以访问和使用
// 2. 获取外部存储的根目录
File directory = Environment.getExternalStorageDirectory();
Log.d("ExternalActivity", "外部存储目录 " + directory.getAbsolutePath());
// 3. 获取外部存储,公共目录
File dcimDir = Environment.getExternalStoragePublicDirectory(
Environment.DIRECTORY_DCIM
);
if (dcimDir.exists()) {
// TODO: 遍历所有的文件,打印出来
File[] files = dcimDir.listFiles();
for (File file : files) {
Log.d("ExternalActivity", "file = " + file);
}
}
// 4. 外部存储可以获取 应用程序特定的一些目录,类似于内部存储的路劲
// /外部根目录/Android/data/包名/
// 使用上下文 Context来获取
getExternalCacheDir();
// 获取外部存储区中,应用程序自身 files 目录内部的文件夹
// 如果传递的参数为 null,直接返回 files 目录,
// 否则 files/xxxx 目录
getExternalFilesDir("images");
}
}
}