2011-11-28 39 views
1

我有一個服務,這是前景。它在本地綁定到一個(或多個)活動,所以活動和服務在同一個進程中運行。可能有一段時間沒有顯示活動(典型的音樂播放器用例)。Android服務在同一進程和內存釋放

如果服務和活動在同一個進程中,那麼活動的內存不能被操作系統收回,除非服務也被終止?答案似乎是肯定的我,根據this article

如果最後一個是真的,我要創建兩個單獨的過程:

  • 要善待系統/其他應用程序?
  • 要更有信心我的服務不會被打死?

或者,這項活動與服務一起存在並沒有什麼大不了的?

回答

1

我有一個服務,這是前臺。它在本地綁定到一個(或多個)活動,所以活動和服務在同一個進程中運行。可能有一段時間沒有顯示活動(典型的音樂播放器用例)。

「典型的音樂播放器用例」不會使用bindService()恕我直言。前臺服務不會使用bindService()恕我直言。至少,另外bindService()對於活動 - >服務通信,您需要startService(),以便在您unbindService()(例如,用戶按BACK)後,服務可以保持運行。

如果服務和活動在同一個進程中,那麼活動的內存不能被操作系統收回,除非服務也被終止?

活動的內存永遠不會被操作系統收回,除非終止整個過程。不幸的是,this is not entirely clear from the documentation

如果用戶按下BACK退出活動,或者您以其他方式在活動上調用finish(),則活動應該被垃圾收集,假設沒有任何東西導致它活動(例如,由靜態數據成員引用) 。

我要創建兩個單獨的過程

絕對不是。

+0

感謝您的回覆。有一點我仍然有點困惑。如果活動是垃圾收集,我想'free()'將被稱爲它佔用的內存塊。如果是的話,內存確實被操作系統「收回」(或者可能被應用程序退回,我可能選擇了一個錯誤的詞,我不是以英語爲母語的人)。雖然你寫道:「操作系統永遠不會收回活動的內存,除非終止你的整個過程。」 – Paolo

+0

@Paolo:「如果活動是垃圾收集,我想這個free()將被稱爲它佔用的內存塊。」 - 不太可能。這不是大多數垃圾收集環境的工作原理。內存可用於虛擬機中的未來分配。 – CommonsWare

+0

這是否意味着如果沒有特別的預防措施,如果用戶按下「home」而不是「back」離開應用程序,後臺服務將始終導致「未使用」的活動保留在內存中?當應用程序不可見時,對尚未使用過的活動手動調用finish()是否是個好主意? – lxgr