概述:

有些应用需要保存配置信息,如是否打开音效开关,登录时是否保存用户名密码等,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.xmlFileInputStream 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。因为在保存和存取时需要编码解码,所有不建议保存尺寸太大的图像数据或二进制文件。

@Overrideprotected 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() {@Overridepublic 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高薪之路》

更多相关文章

  1. Android解决WifiManager.removeNetwork()失败--赋予app系统权限
  2. android红米等关于读取本地文件夹图片获取路径的问题的解决
  3. android解决读取assets文件夹下的json或txt文件乱码问题
  4. Android运行时权限一览表
  5. Android读取手机文件列表
  6. Android培训班(28)
  7. [经验总结]android下反射读取资源id的api
  8. Android启动时动态加载权限
  9. Android(安卓)Recovery相关流程汇总

随机推荐

  1. Android(安卓)对话框(Dialog)大全
  2. TextView 限制最大行数、最小行数、字数
  3. Android四种Activity的加载模式
  4. cocos2d-x 1.0.1 for Android(安卓)使用B
  5. 面试准备(待整理、未完待续。。)
  6. EditText所有属性详解
  7. Android开机广播和关机广播
  8. Android(安卓)中 PopupWindow的用法 汇总
  9. 有米Android(安卓)SDK开发者文档
  10. Android(安卓)O(8.0)创建桌面快捷方式