2011-08-24 57 views
-1

我正在研究一個必須在整個活動中維護全局狀態的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結果。由於某種原因,這不是推薦的方法嗎?否則,它可以作爲解決面臨同樣問題的其他人的解決方案。

+1

lol不在應用程序上實現可序列化。取而代之的是讓一個Singleton對象具有你想要的所有變量。然後你可以使這個序列化並使用它。 – Blundell

+0

我大部分都很好奇,看它是否可以工作,因爲我已經在使用Application,所以很容易就可以測試它。但後果是什麼? – user909722

+0

它不會工作.... – Blundell

回答

0

SharedPreferences使您能夠以您想要的方式保存狀態,因此當在Application對象中進行更改時,全局變量將在SharedPreferences中更新。 使用應用程序的全局狀態是好的,雖然我不確定依靠onDestroy在應用程序中調用是最好的。 當在Application中再次調用onCreate時,您可以重新啓動狀態。

+0

哦,這是在毀滅的活動,調用保存。在這種情況下,Application對象不一定會被銷燬,我不這麼認爲,所以你可以無故保存應用程序狀態。我不確定這一點,所以我可以去檢查我自己,可以解釋爲什麼別人不這樣保存狀態。 – manno23

+0

這是一個不錯的主意,但對我來說這不太合適。我存儲的文件包含多個ArrayLists,將它們轉換爲'SharedPreferences'並返回將會是太多工作。 – user909722

+0

是的,這是調用'onDestroy()'的主要活動。也許我可以調用'isFinishing()'來確定活動是否正常結束或被殺死。 – user909722