概述:
有些应用需要保存配置信息,如是否打开音效开关,登录时是否保存用户名密码等,Android对这类应用提供了SharedPreferences(共享首选项),SharedPreference适合数量少、数据以key-value类型的保存。
使用步骤:
1、使用Context.getSharedPreferences(String fileName,int mode)方法获取SharedPreferences对象。
param1:指定SharedPreferences保存、读取的文件名。该文件存放在data/data/packageName/shared_prefs文件夹下。在file-explorer中能找到该文件,默认名:类名.xml。
param2:MODE,权限
MODE_WORLD_PRIVATE:私有属性,只有本项目才能读取上面Param1指定的XML
MODE_WORLD_READABLE:运行其他项目读取本项目中的XML。只读
MODE_WORLD_WRITEABLE:只写
2、获取SharedPreferences.Editor对象
SharedPreferences.Editor editor = mySharedPreferences.edit();
3、通过使用SharedPreferences.Editor接口的putXxx()保存值
4、通过使用SharedPreferences.Editor.commit方法提交要保存的key-value对。
注意:commit方法相当于事务中的commit操作,只要在事件结束后进行提交,才会将key-value真正保存在对应的文件中。
SharedPreferences my = getSharedPreferences("config", MODE_PRIVATE); SharedPreferences.Editor editor = my.edit(); editor.putString("name", "aaa"); editor.putBoolean("flag", "true"); editor.commit();
经典问题:
1、使用IO读取SharedPreference
try { String path = android.os.Environment.getDataDirectory() .getAbsolutePath() + "/data/" + getPackageName() + "/shared_prefs/abc.xml"; Log.i("TAG", android.os.Environment.getDataDirectory() .getAbsolutePath()); // data/data/com.example.test_preferences/shared_prefs/abc.xml FileInputStream fis = new FileInputStream(path); InputStreamReader isr = new InputStreamReader(fis); BufferedReader br = new BufferedReader(isr); Toast.makeText(this, br.readLine(), 3000).show(); fis.close(); } catch (Exception e) { e.printStackTrace(); }
2、将SharedPreferences数据保存在SD卡上。
分析SharedPreferences的源码,发现xml默认保存在shared_prefs目录中,但是可以通过JAVA反射来修改。
public void saveSD() { try { Field field = ContextWrapper.class.getDeclaredField("mBase"); field.setAccessible(true); // 获取mBase变量的值 Object obj = field.get(this); field = obj.getClass().getDeclaredField("mPreferencesDir"); field.setAccessible(true); File file = new File("/sdcard0"); field.set(obj, file); SharedPreferences my = getSharedPreferences("config", MODE_PRIVATE); SharedPreferences.Editor editor = my.edit(); editor.putString("name", "aaa"); editor.commit(); } catch (Exception e) { e.printStackTrace(); } }
3、SharedPreferences保存图像
分析:原则上SharedPreferences只能将字符串以key-value的形式保存。可以采用编码的方式将任何二进制数据转换成字符串形式,保存在SharedPreferences中。
最常用的是Base64。因为在保存和存取时需要编码解码,所有不建议保存尺寸太大的图像数据或二进制文件。
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.image); try { btn = (Button) findViewById(R.id.btn_img); img = (ImageView) findViewById(R.id.image); img2 = (ImageView) findViewById(R.id.image2); pref = getSharedPreferences("baseImg", Activity.MODE_PRIVATE); String de = pref.getString("imagessss", null); if (de != null) { byte[] bytes = Base64.decodeBase64(de.getBytes()); ByteArrayInputStream bais = new ByteArrayInputStream(bytes); img2.setImageDrawable(Drawable.createFromStream(bais, "image")); } btn.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { try { // Drawable ddd = getResources().getDrawable(R.drawable.ic_launcher); // ((BitmapDrawable) ddd).getBitmap(); ByteArrayOutputStream baos = new ByteArrayOutputStream(); //把图片压缩到baos字节流中 ((BitmapDrawable) img.getDrawable()).getBitmap() .compress(CompressFormat.JPEG, 50, baos); //编码过程 String image = new String(Base64.encodeBase64(baos .toByteArray())); SharedPreferences.Editor editor = pref.edit(); editor.putString("imagessss", image); editor.commit(); } catch (Exception e) { e.printStackTrace(); } } }); } catch (Exception e) { e.printStackTrace(); } }
说明:本文参照李宁老师的《Android高薪之路》