我正在研究一个必须在各个活动中保持全局状态的android项目。为此,我成功地扩展了应用程序。然而,对项目的一个新要求是即使应用程序被Android操作系统杀死也要保持状态,因为这个简单的扩展应用程序是不够的,因为该对象将随应用程序一起被杀死。
为了解决这个问题,我已经将Serializable实现为扩展Application的对象:
public class AppState extends Application implements Serializable
然后在主要活动被销毁时将对象写入私有存储:
@Override
public void onDestroy() {
super.onDestroy();
ByteArrayOutputStream bos = null;
ObjectOutputStream oos = null;
FileOutputStream fos = null;
// If there's a certificate creation in progress, let's store it more
// permanently before killing the app.
if (appState.getCertificate() != null) {
try {
bos = new ByteArrayOutputStream();
oos = new ObjectOutputStream(bos);
oos.writeObject(appState);
byte[] buf = bos.toByteArray();
fos = openFileOutput(Constants.objectStoreFileName, Context.MODE_PRIVATE);
fos.write(buf);
} catch (IOException e) {
e.printStackTrace();
} finally {
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (oos != null) {
try {
oos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
然后我通过调用:
恢复对象 private void getAppStateFromFile() {
FileInputStream fis = null;
ObjectInputStream ois = null;
ByteArrayOutputStream bos = null;
try {
fis = openFileInput(Constants.objectStoreFileName);
bos = new ByteArrayOutputStream();
byte[] b = new byte[1024];
int bytesRead = 0;
while ((bytesRead = fis.read(b)) != -1) {
bos.write(b, 0, bytesRead);
}
byte[] bytes = bos.toByteArray();
ois = new ObjectInputStream(new ByteArrayInputStream(bytes));
AppState appStateFromFile = (AppState) ois.readObject();
if (appStateFromFile != null) {
// restore values from appStateFromFile
}
} catch (StreamCorruptedException e) {
e.printStackTrace();
} catch (OptionalDataException e) {
e.printStackTrace();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (ClassNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
} finally {
deleteFile(Constants.objectStoreFileName);
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (ois != null) {
try {
ois.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (bos != null) {
try {
bos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
它工作正常,但我很好奇有多少人使用过这种方法。我认为这很常见,因为我已经阅读了很多关于想要更永久地保存状态的人。但对于我的surprice google搜索“'扩展应用程序实现Serializable'android”返回0结果。出于某种原因,这不是推荐的方法吗?否则,它可以作为面临同样问题的其他人的解决方案。
答案 0 :(得分:0)
SharedPreferences
使您能够以所需的方式保存状态,因此在SharedPreferences
对象中进行更改时,Application
中的全局变量会更新。
使用Application for global state是好的,虽然我不确定依赖onDestroy
在应用程序中调用是最好的。
在onCreate
中再次调用Application
时,您可以重新启动状态。