在Android系统中提供了多种存储技术.经过这些存储技术能够将数据存储在各类存储介质上.好比sharedpreferences能够将数据保存着应用软件的私有存储区,这些存储区的数据只能被写入这些数据的软件读取.固然Android还支持文件存储、SQLite数据库和Content Provider。在这里咱们将对sharedpreferences存储方式进行介绍。html
SharedPreferences是一种轻量级的数据存储方式,学过Web开发的同窗,能够想象它是一个小小的Cookie。它能够用键值对的方式把简单数据类型(boolean、int、float、long和String)存储在应用程序的私有目录下(data/data/包名 /shared_prefs/)本身定义的xml文件中。java
SharedPreferences是以键值对来存储应用程序的配置信息的一种方式,它只能存储基本数据类型。一个程序的配置文件仅能够在本应用程序中使用,或者说只能在同一个包内使用,不能在不一样的包之间使用。实际上sharedPreferences是采用了XML格式将数据存储到设备中,在DDMS中的File Explorer中的/data/data//shares_prefs下。linux
(1)经过函数Context.getSharedPreferences(String name,int mode),其中name为本组件的配置文件名(若是想要与本应用程序的其余组件共享此配置文件,能够用这个名字来检索到这个配置文件),mode为操做模式,默认的模式为0或MODE_PRIVATE;返回值为SharedPreferences。android
(2)经过函数Activity.getPreferences(int mode),其中配置文件仅能够被调用的Activity使用。mode为操做模式,默认的模式为0或MODE_PRIVATE;返回值为SharedPreferences。数据库
保存key-value对通常要指定一个文件名,而后用相似putString的方法指定key和value。SharedPreferences也采用了一样的方法。使用SharedPreferences保存key-value对的步骤以下:app
(1) 使用Activity类的getSharedPreferences方法得到SharedPreferences对象。其中存储key-value的文件名的名称由getSharedPreferences方法的第一个参数指定。ide
(2) 使用SharedPreferences接口的edit得到SharedPreferences.Editor对象。函数
(3) 经过SharedPreferences.Editor接口的putXXX方法保存key-value对。其中XXX表示value的不一样数据类型。Boolean类型的value则是用putBoolean方法,字符串类型的则为putString方法。测试
(4) 经过SharedPreferences.Editor接口的commit方法保存key-value对。Commit方法至关于数据库事务中的提交(commit)操做。只有在事件结束后进行提交,才会将数据真正保存在数据库中。保存key-value也是同样。this
SharedPreferences将数据文件写在手机内存私有的目录中。在模拟器中测试程序能够经过ADT的DDMS透视图来查看数据文件的位置。
前面介绍的SharedPreferences只能保存简单类型的数据,例如,string,int等。若是须要存取比较复杂的数据类型好比类或者图像,则须要对这些数据进行编码,一般将其转换成Base64编码,而后将转换后的数据以字符串的形式保存在XML文件中。
SharedPreferences保存List集合
public static String WeatherList2String(List<Weather> WeatherList)
throws IOException {
// 实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件。
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
// 而后将获得的字符数据装载到ObjectOutputStream
ObjectOutputStream objectOutputStream = new ObjectOutputStream(
byteArrayOutputStream);
// writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法能够还原它
objectOutputStream.writeObject(WeatherList);
// 最后,用Base64.encode将字节文件转换成Base64编码保存在String中
String WeatherListString = new String(Base64.encode(
byteArrayOutputStream.toByteArray(), Base64.DEFAULT));
// 关闭objectOutputStream
objectOutputStream.close();
return WeatherListString;
}
@SuppressWarnings("unchecked")
public static List<Weather> String2WeatherList(String WeatherListString)
throws StreamCorruptedException, IOException,
ClassNotFoundException {
byte[] mobileBytes = Base64.decode(WeatherListString.getBytes(),
Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(
mobileBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(
byteArrayInputStream);
List<Weather> WeatherList = (List<Weather>) objectInputStream
.readObject();
objectInputStream.close();
return WeatherList;
}
public static String WeatherList2String(List<Weather> WeatherList) throws IOException { // 实例化一个ByteArrayOutputStream对象,用来装载压缩后的字节文件。 ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); // 而后将获得的字符数据装载到ObjectOutputStream ObjectOutputStream objectOutputStream = new ObjectOutputStream( byteArrayOutputStream); // writeObject 方法负责写入特定类的对象的状态,以便相应的 readObject 方法能够还原它 objectOutputStream.writeObject(WeatherList); // 最后,用Base64.encode将字节文件转换成Base64编码保存在String中 String WeatherListString = new String(Base64.encode( byteArrayOutputStream.toByteArray(), Base64.DEFAULT)); // 关闭objectOutputStream objectOutputStream.close(); return WeatherListString; } @SuppressWarnings("unchecked") public static List<Weather> String2WeatherList(String WeatherListString) throws StreamCorruptedException, IOException, ClassNotFoundException { byte[] mobileBytes = Base64.decode(WeatherListString.getBytes(), Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream( mobileBytes); ObjectInputStream objectInputStream = new ObjectInputStream( byteArrayInputStream); List<Weather> WeatherList = (List<Weather>) objectInputStream .readObject(); objectInputStream.close(); return WeatherList; }
SharedPreferences保存图片和可序列化的对象
查看源代码
package android.test.sharedpreferencescomplex;
import java.io.Serializable;
public class MobileInfo implements Serializable {
private static final long serialVersionUID = 1L;
public String name;
public String infoString;
}
package android.test.sharedpreferencescomplex;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import android.os.Bundle;
import android.app.Activity;
import android.content.SharedPreferences;
import android.content.SharedPreferences.Editor;
import android.graphics.Bitmap.CompressFormat;
import android.graphics.BitmapFactory;
import android.graphics.drawable.Drawable;
import android.util.Base64;
import android.view.Menu;
import android.view.View;
import android.widget.ImageView;
import android.widget.Toast;
public class MainActivity extends Activity {
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
}
public void onclick_Write_Image(View v) throws Throwable {
SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream);
String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
editor.putString("image", imageString);
editor.commit();
byteArrayOutputStream.close();
}
public void onclick_Read_Image(View view) throws Throwable {
SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
String string = sharedPreferences.getString("image", "");
byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes);
ImageView imageView =(ImageView)findViewById(R.id.imageView1);
imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image"));
byteArrayInputStream.close();
}
public void onclick_Write_Data(View view) throws Throwable
{
MobileInfo mobile = new MobileInfo();
mobile.name = "魅族";
mobile.infoString = "魅族MX";
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream);
objectOutputStream.writeObject(mobile);
SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
Editor editor = sharedPreferences.edit();
sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE);
String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT));
editor.putString("mobile", mobilesString);
editor.commit();
objectOutputStream.close();
}
public void onclick_Read_Data(View view) throws Throwable, Throwable
{
SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE);
String mobilesString = sharedPreferences.getString("mobile", "");
byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT);
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes);
ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream);
MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject();
Toast.makeText(this,"手机品牌:" + mobileInfo.name + "\n手机型号:" + mobileInfo.infoString,
Toast.LENGTH_LONG).show();
objectInputStream.close();
}
}
查看源代码 package android.test.sharedpreferencescomplex; import java.io.Serializable; public class MobileInfo implements Serializable { private static final long serialVersionUID = 1L; public String name; public String infoString; } package android.test.sharedpreferencescomplex; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import android.os.Bundle; import android.app.Activity; import android.content.SharedPreferences; import android.content.SharedPreferences.Editor; import android.graphics.Bitmap.CompressFormat; import android.graphics.BitmapFactory; import android.graphics.drawable.Drawable; import android.util.Base64; import android.view.Menu; import android.view.View; import android.widget.ImageView; import android.widget.Toast; public class MainActivity extends Activity { @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); } public void onclick_Write_Image(View v) throws Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); Editor editor = sharedPreferences.edit(); ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream(); BitmapFactory.decodeResource(getResources(), R.drawable.image1).compress(CompressFormat.JPEG, 50, byteArrayOutputStream); String imageString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT)); editor.putString("image", imageString); editor.commit(); byteArrayOutputStream.close(); } public void onclick_Read_Image(View view) throws Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE); String string = sharedPreferences.getString("image", ""); byte[] imageBytes = Base64.decode(string.getBytes(), Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageBytes); ImageView imageView =(ImageView)findViewById(R.id.imageView1); imageView.setImageDrawable(Drawable.createFromStream(byteArrayInputStream, "image")); byteArrayInputStream.close(); } public void onclick_Write_Data(View view) throws Throwable { MobileInfo mobile = new MobileInfo(); mobile.name = "魅族"; mobile.infoString = "魅族MX"; ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream(); ObjectOutputStream objectOutputStream = new ObjectOutputStream(byteArrayOutputStream); objectOutputStream.writeObject(mobile); SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); Editor editor = sharedPreferences.edit(); sharedPreferences = getSharedPreferences("complex",Activity.MODE_PRIVATE); String mobilesString = new String(Base64.encode(byteArrayOutputStream.toByteArray(),Base64.DEFAULT)); editor.putString("mobile", mobilesString); editor.commit(); objectOutputStream.close(); } public void onclick_Read_Data(View view) throws Throwable, Throwable { SharedPreferences sharedPreferences = getSharedPreferences("complex", Activity.MODE_PRIVATE); String mobilesString = sharedPreferences.getString("mobile", ""); byte[] mobileBytes = Base64.decode(mobilesString.getBytes(),Base64.DEFAULT); ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(mobileBytes); ObjectInputStream objectInputStream = new ObjectInputStream(byteArrayInputStream); MobileInfo mobileInfo = (MobileInfo) objectInputStream.readObject(); Toast.makeText(this,"手机品牌:" + mobileInfo.name + "\n手机型号:" + mobileInfo.infoString, Toast.LENGTH_LONG).show(); objectInputStream.close(); } }
由于Android系统并非彻底的创新的操做系统,而是在linux内核基础上发展起来的一个移动操做系统,因此android还有一些linux的基本特性。咱们用getsharedPreferences方法得到sharedpreferences对象,getsharedPreferences方法的第2个参数值使用到了Activity.MODE_PRIVATE常量。除了这个常量之外还可使用另外3个常量。这4个常量用于指定文件的创建模式。他们一个重要的功能就是设置文件的属性,从而能够设置数据文件的访问权限。
因为SharedPreferences能够很容易的保存key-value对,所以,一般使用SharedPreferences保存配置信息。不过Android SDK提供了更为容易的方法来设计配置界面,而且能够透明地保存配置信息。这就是PreferenceActivity。
PreferenceActivity是Activity的子类,该类封装了SharedPreferences。所以,PreferenceActivity的全部子类都拥有保存key-value对的能力。
PreferenceActivity提供了一些经常使用的设置项,这些设置项能够知足大多数的配置界面的要求。与组件同样,这些配置项既能够从XML文件建立,也能够从代码建立。比较经常使用的有:
推荐文章:http://www.cnblogs.com/ikarl/archive/2012/11/13/2768344.html