1

我有一個使用AlarmManager定期執行任務的應用程序。從AlarmManager調用的Intent中,我訪問應用程序以訪問共享數據。由AlarmManager啓動的Intent會在運行之間保留其對象嗎?

Application foo = getApplication(); 

然後我使用foo對象來讀取和寫入數據。此應用程序的大部分生命週期都處於休眠狀態,偶爾會起牀。

按照developer documentation

當警報響起時,已被註冊,因爲這是 由系統廣播,自動啓動目標程序 如果它尚未運行的意圖。

但是,instatiated foo對象會發生什麼? (其中所有其他對象都是由Intent創建的)這與以前的迭代是一樣的還是將會是一個新的?

回答

2

foo的對象,作爲Application類的一個實例,將只要繼續存在作爲

  • 過程在此是應用程序正在運行仍然活着。
  • 垃圾收集器不標記&掃描應用程序堆上的對象。

當進程終止時,內核將回收內存,並且您的foo對象將會消失。如果您的應用長時間後退到後臺,那麼foo對象不再是的範圍,並且將由垃圾收集器以正常方式處理。

每次AlarmManager創建Service的新實例時,都會生成一個運行應用程序的新進程(如果該應用程序尚未運行),並且Service將從此進程中運行。只要包含的進程處於活動狀態並且它在堆上具有有效的引用,foo對象就會保留在範圍內。

作爲開發人員,你應該總是假設你Service單獨運行,無論是包含您的應用程序將被殺死,過程之間 GC將標誌着通過您的應用程序的堆&橫掃。這是最可能的情況,你無法控制它。因此,您的問題的答案是foo對象可能會在您的Service運行時成爲新實例。

欲瞭解更多信息,請參見herehere

+0

很好的答案。換句話說,我應該避免將易失性數據保存在foo對象的屬性中。 – 2015-02-17 21:38:31

+0

如果您的進程被終止,Dalvik虛擬機將不會運行。內存被內核清除。 Android會拆卸活動併發出內存警告,您可以響應並釋放一些對象,但如果您的過程僅由低內存殺手清除,則不會得到任何內容。 – dcow 2015-02-17 21:39:09

相關問題