我有一个实现Parcelable一类,因为它包含了一些基本的Android类,我不能修改无法实现Serializable。
一些在这个类的对象是例如位置和的PendingIntent(这些都是方便Parcelable)。
我的问题是救了我的主要活动的实例之间的这种信息。
目前,我手里拿的静态引用这个类,效果很好。 但我相信,当我重新安装应用程序,并可能在更新将来到身边,我不能相信,这个静态成员不会被重新初始化。
我试着写这个Parcelable到一个文件,但使用马歇尔()并不总是工作(我收到活页夹不能被整理错误)。
我怎样才能安全地保存这些信息?
谢谢
我使用的是实行国家控制类来处理的读/写盘:
public class StateControl {
Context mContext;
Thread worker;
WriteObjectToFile writer;
// StateControl Constructor
public StateControl(Context context) {
mContext = context;
// Construct a writer to hold and save the data
writer = new WriteObjectToFile();
// Construct a worker thread to handle the writer
worker = new Thread(writer);
}// end of StateControl constructor
// Method to save the global data
public void saveObjectData(Object object, String key) {
if (object == null){
// I had a different action here
} else {
// Write the data to disc
writer.setParams(new WriteParams(object, key));
worker.run();
}
}// end of saveGlobalData method
// Method to read the Global Data
public Object readObjectData(String key){
Object returnData = (Object) readObjectFromFile(key);
if (returnData == null){
// I had a different action here
} else {
return returnData;
}
}// end of readGlobalData method
// Method to erase the Global data
public void clearObjectData(String key){
writer.setParams(new WriteParams(null, key));
worker.run();
}// end of clearGlobalData method
private class WriteObjectToFile implements Runnable {
WriteParams params;
public void setParams(WriteParams params) {
this.params = params;
}
public void run() {
writeObjectToFile(params.getObject(), params.getFilename());
}
private boolean writeObjectToFile(Object object, String filename) {
boolean success = true;
ObjectOutputStream objectOut = null;
try {
FileOutputStream fileOut = mContext.openFileOutput(filename, Activity.MODE_PRIVATE);
objectOut = new ObjectOutputStream(fileOut);
objectOut.writeObject(object);
fileOut.getFD().sync();
} catch (IOException e) {
success = false;
e.printStackTrace();
} finally {
if (objectOut != null) {
try {
objectOut.close();
} catch (IOException e) {
// do nothing
}
}// end of if
}// End of try/catch/finally block
return success;
}
}// end of writeObjectToFile method
private Object readObjectFromFile(String filename) {
ObjectInputStream objectIn = null;
Object object = null;
try {
FileInputStream fileIn = mContext.getApplicationContext().openFileInput(filename);
objectIn = new ObjectInputStream(fileIn);
object = objectIn.readObject();
} catch (FileNotFoundException e) {
// Do nothing
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} finally {
if (objectIn != null) {
try {
objectIn.close();
} catch (IOException e) {
// do nowt
}
}
}
return object;
}
private static class WriteParams {
Object object;
String filename;
public WriteParams(Object object, String filename) {
super();
this.object = object;
this.filename = filename;
}
public Object getObject() {
return object;
}
public String getFilename() {
return filename;
}
}
}
然后调用公共方法揭开序幕的写入/读取。 对于这个版本,我也有它发生在一个单独的线程,但你可以修改,如果你需要的。
使用您的示例中的静态导致内存泄漏,而不是做任何事情的好办法。
我建议只有3例使用静态:
- 静态最终字符串或INT - 常量
- 上内部类(使得它们不包含参考外部类)
- 在UTIL或在某些情况下(如CustomFragment.newInstance)工厂方法
现在的问题是,为什么你想坚持的PendingIntent? 它的用例是进程间的通信。
活页夹
大多数开发商不会直接实现这个类,而不是使用AIDL工具来描述所需的接口,有它产生相应的活页夹的子类。
从官方文档
你需要存储的Binder
对象与对象的其余部分? 也许你可以保存你的对象没有Binder
的实例,并重新创建的Binder
与对象aidl
您恢复对象之后