2012-09-10 54 views
4

我創建了一個Android應用程序有一個活動和包名"com.explore" Android應用程序比。流程

  <category android:name="android.intent.category.LAUNCHER" /> 
     </intent-filter> 

我運行ps命令。

USER  PID PPID VSIZE RSS  WCHAN PC   NAME 
app_137 2974 91 478604 48524 ffffffff 00000000 S com.explore 

我按下後退按鈕。我退出應用程序並進入主屏幕 現在再次運行ps命令。

USER  PID PPID VSIZE RSS  WCHAN PC   NAME 
app_137 2974 91 472428 42572 ffffffff 00000000 S com.explore 

進程2974仍在運行。有人能解釋我的行爲嗎?這是內存使用情況,狀態或進程將持續多久?我應該在按下後從我的代碼中殺死進程嗎?如何優雅地殺死進程?

+3

我認爲你應該問自己的問題是:你爲什麼要殺死你的應用程序? Android非常擅長管理前臺和後臺進程。它會在用戶請求或內存不足時終止進程。 – Eric

+0

其實我想了解Android架構中的流程管理。我只是發現了這種行爲。在檢查之前,我相信「每個進程都有自己的進程ID,當用戶退出應用程序時進程會被終止,下一次重新啓動時會得到新的進程ID。」但是現在我發現「進程繼續運行,即使用戶退出應用程序。下一次重新啓動時,它會得到相同的進程ID。」 –

回答

5

當你運行一個應用程序時,如果它沒有運行,它會得到一個新的進程ID。這個ID一直存在,直到它不在內存中。 (這可以通過使用應用程序設置中的「強制停止」選項來實現和測試。)

但是,當用戶點擊後退或主頁按鈕時,應用程序不會退出,並且在大多數情況下只會暫停或停止。

您可以閱讀this documentation,詳細瞭解流程生命週期。第1和第2點基本上說前臺進程(或者一個表面之後的東西,比如對話)不會被終止,除非絕對必要(強制關閉或者沒有內存)。第3點很重要;它說任何不再需要的過程 - 用戶已經「關閉」它 - 可能會或可能不會被殺死,這取決於設備的內存。最後,點4,任何沒有做任何事情,但只是..現有..將盡快被殺死。您可能還想看看Activity lifecycle。這將準確地顯示應用程序的每個步驟何時發生(即,何時暫停,何時停止以及何時銷燬)。它唯一沒有涉及的內容是過度分配內存(或重新觸發整個生命週期的方向更改)。

總之,請記住,Android是聰明的。它比大多數開發人員更願意管理其流程,並儘可能保留儘可能多的流程以便重用。除非你是絕對肯定,你想你的過程內存不足,你永遠不應該殺了它。和the way we have to kill and manage processes is never pretty

+0

所以,相反,如果背景應用程序開始死亡沒有很好的理由(例如,大量的內存,但Whatsapp被關閉),這將表明Android操作系統級別的問題? – jiggunjer

+0

@jiggunjer我相信是的,但是我不能確定地說。 – Eric

2

開始閱讀fundamentals。總之,在大多數情況下,您不應該關注流程,Android會自動啓動和停止這些流程。殺死過程可能會導致系統重新啓動它,所以通常沒有太大的收穫。忘記「任務殺手」和類似的公用事業,他們現在大多沒用。

+0

是的,我已經開發和發佈的應用程序沒有照顧它。但我只是發現了這種行爲。所以我很想知道它的影響或android如何管理它? –

+0

這有點複雜,細節可能會有所變化。一般來說,除非必須,否則Android不會終止進程,因爲您很可能會使用在您使用其他應用程序後再次打開的應用程序。具有前臺活動的應用程序具有最大的優先級,後臺和服務的優先級較低。當內存恐慌時,它開始從最低優先級的進程中開始查殺進程。這是所有爲你自己的(用戶)好:) –