我正在研究一個必須在整個活動中維護全局狀態的android項目。爲此,我正在成功擴展應用程序。然而,該項目的一個新要求是即使應用程序被android操作系統殺死也要保持狀態,並且對於這個簡單的擴展應用程序將是不夠的,因爲該對象將與應用程序一起被殺死。序列化擴展的對象應用程序
爲了解決這個我已經實現Serializable接口來擴展應用對象:
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();
}
}
}
}
它工作正常,但我g不知道有多少人使用過這種方法。我認爲這很常見,因爲我已經閱讀了很多關於人們想要更長期地保存國家的信息。但對我的surprice googling「'擴展應用程序實現Serializable'android」返回0結果。由於某種原因,這不是推薦的方法嗎?否則,它可以作爲解決面臨同樣問題的其他人的解決方案。
lol不在應用程序上實現可序列化。取而代之的是讓一個Singleton對象具有你想要的所有變量。然後你可以使這個序列化並使用它。 – Blundell
我大部分都很好奇,看它是否可以工作,因爲我已經在使用Application,所以很容易就可以測試它。但後果是什麼? – user909722
它不會工作.... – Blundell