1. MainActivity.java
package powerise.demo01;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.io.OptionalDataException;
import java.io.StreamCorruptedException;
import java.util.Date;
import org.apache.commons.codec.binary.Base64;
import android.app.Activity;
import android.content.Context;
import android.content.SharedPreferences;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;
public class MainActivity extends Activity {
private EditText et_id = null;
private EditText et_name = null;
private Button btn_save = null;
private TextView tv_result = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
initGUIElements();
getObjectInfo();
btn_save.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View v) {
String id = et_id.getText().toString();
String name = et_name.getText().toString();
saveObject(id, name);
getObjectInfo();
}
});
}
protected void getObjectInfo() {
try {
SharedPreferences mSharedPreferences = getSharedPreferences("base64", Context.MODE_PRIVATE);
String personBase64 = mSharedPreferences.getString("person", "");
byte[] base64Bytes = Base64.decodeBase64(personBase64.getBytes());
ByteArrayInputStream bais = new ByteArrayInputStream(base64Bytes);
ObjectInputStream ois = new ObjectInputStream(bais);
Person person = (Person) ois.readObject();
tv_result.setText(person.toString());
} catch (Exception e) {
e.printStackTrace();
}
}
private void initGUIElements() {
et_id = (EditText) findViewById(R.id.et_id);
et_name = (EditText) findViewById(R.id.et_name);
btn_save = (Button) findViewById(R.id.btn_save);
tv_result = (TextView) findViewById(R.id.tv_result);
}
private void saveObject(String id, String name) {
SharedPreferences mSharedPreferences = getSharedPreferences("base64", Context.MODE_PRIVATE);
Person person = new Person(Integer.parseInt(id), name, new Date());
try {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ObjectOutputStream oos = new ObjectOutputStream(baos);
oos.writeObject(person);
String personBase64 = new String(Base64.encodeBase64(baos.toByteArray()));
SharedPreferences.Editor editor = mSharedPreferences.edit();
editor.putString("person", personBase64);
editor.commit();
} catch (IOException e) {
e.printStackTrace();
}
}
}
2. Person.java
package powerise.demo01;
import java.io.Serializable;
import java.util.Date;
public class Person implements Serializable {
private static final long serialVersionUID = 4318838659250781721L;
private int id;
private String name;
private Date birthday;
public Person(int id, String name, Date birthday) {
this.id = id;
this.name = name;
this.birthday = birthday;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Date getBirthday() {
return birthday;
}
public void setBirthday(Date birthday) {
this.birthday = birthday;
}
@Override
public String toString() {
return "Person [id=" + id + ", name=" + name + ", birthday=" + birthday + "]";
}
}
3. main.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="编号:" /> <EditText android:id="@+id/et_id" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="姓名:" /> <EditText android:id="@+id/et_name" android:layout_width="fill_parent" android:layout_height="wrap_content"/> <Button android:id="@+id/btn_save" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="保存" /> <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="结果:" /> <TextView android:id="@+id/tv_result" android:layout_width="fill_parent" android:layout_height="wrap_content"/> </LinearLayout>
小记:
保存 Object 对象, 最终是以 String 形式保存在 SharedPreferences 中.
首先将 Object 对象放入到 Object输出流中(ObjectOutputStream), 再用 Base64 将流转换 byte[]
读取 Object 对象, 则相反
注意: 要在 http://commons.apache.org/codec/download_codec.cgi 中下载 Base64 jar 包并添加到 BuildPath 中.