当前位置: 代码迷 >> Android >> Android储存之SharedPreferences1
  详细解决方案

Android储存之SharedPreferences1

热度:52   发布时间:2016-04-28 06:33:06.0
Android存储之SharedPreferences1

概述:
?

? ? 有些应用需要保存配置信息,如是否打开音效开关,登录时是否保存用户名密码等,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高薪之路》

  相关解决方案