SharePreferences基础:
一个轻量级的存储类,特别适合用于保存软件配置参数。returned by getSharedPreferences (String name,int mode) , go through an SharedPreferences.Editor object , 实现类为SharedPreferencesImpl,只获取数据而不存储和修改,存储修改是实现类EditorImpl
用SharedPreferences保存数据,其实是用xml文件存放数据,存放在/data/data/<package name>/shared_prefs目录下
存储数据:
SharedPreferences sharedPreferences = getSharedPreferences("fileName, Context.MODE_PRIVATE); //私有数据
Editor editor = sharedPreferences.edit(); //获取存储器
editor.putString("key", "key"); //采用key-value键值对存放
editor.putInt("age", 4);
editor.commit(); //提交
获取数据:
SharedPreferences sPres=getSharedPreferences("fileName",Context.MODE_PRIVATE);
int age=sPres.getInt("age",0);
String str=sPres.getString("key",""); //第二个参数为默认值,如果preference中不存在该key,将返回默认值
生成fileName.xml文件内容如下:
<?xml version='1.0' encoding='utf-8' standalone='yes' ?>
<map>
<string name="key">key</string>
<int name="age" value="4" />
</map>
- getSharedPreferences (String name,int mode)
name为文件的名称,名称不用带后缀,后缀会由Android自动加上;
mode为指定文件的操作模式,有以下四种。
- MODE_APPEND: 追加方式存储
- MODE_PRIVATE: 私有方式存储,其他应用无法访问
- MODE_WORLD_READABLE: 表示当前文件可以被其他应用读取
- MODE_WORLD_WRITEABLE: 表示当前文件可以被其他应用写入
SharePreferences保存对象/文件
- 保存/读取图片
**保存图片**
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//使用BitmapFactory拿到压缩文件,compress方法压缩并保存到byteArrayOutputStream
BitmapFactory.decodeResource(getResources(), R.drawable.image).compress(Bitmap.CompressFormat.JPEG, 60, byteArrayOutputStream);
//通过Base64.encode将字节文件转换成Base64编码保存在String中。
String imageStr = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
byteArrayOutputStream.close();
**读取图片**
//对Base64格式的字符串解码,还原成字节数组。
byte[] imageBytes = Base64.decode(imageStr.getBytes(), Base64.DEFAULT);
//字节数组装载到ByteArrayInputStream。
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
//Drawable.createFromSteam方法将byteArrayInputStream编译成图片文件。
ImageView imageView = (ImageView) findViewById(R.id.imageView);
imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
byteArrayInputStream.close();
- 保存/读取对象
**保存对象**
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
//然后将得到的字符数据装载到ObjectOutputStream。
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
//writeObject 写入对象 / 读取的时候 readObject 还原对象。
objectOutputStream.writeObject(mobile);
//最后,用Base64.encode将字节文件转换成Base64编码保存在String中
String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
//关闭objectOutputStream
objectOutputStream.close();
**读取对象**
byte[] userBytes = Base64.decode(mobilesString.getBytes(), Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(userBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
User user = (User) objectInputStream.readObject();
objectInputStream.close();
相关扩展
- 如果要删除通过SharedPreferences产生的文件,方法:
File file= new File("/data/data/"+getPackageName().toString()+"/shared_prefs","fileName.xml");
if(file.exists()){
file.delete();
Toast.makeText(MainActivity.this, "删除成功",Toast.LENGTH_LONG).show();
}
- 访问其他应用的SharedPreferences
首先满足条件,被访问的应用的Preferences创建时指定Context.MODE_WORLD_READABLE或Context.MODE_WORLD_WRITEABLE模式。假设包名为com.ai.demo的应用创建了Preferences
1.第一种获得应用Context,通过Context访问Preferences,访问preferences时会在应用所在包下的shared_prefs目录找到preferences:
Context appsContext = createPackageContext("com.ai.demo", Context.CONTEXT_IGNORE_SECURITY);
SharedPreferences sPrefs = appsContext.getSharedPreferences("fileName", Context.MODE_WORLD_READABLE);
int age = sPrefs.getInt("age", 0);
String name = sPrefs.getString("name", "");
2.第二种读取xml文件方式直接访问其他应用preference对应的xml文件
File xmlFile = new File("/data/data/"+com.ai.demo+"/shared_prefs/fileName.xml");