2012-12-04 33 views
9

我開發Android發射器(主屏幕更換)應用程序和運行到發射器調整優先在低內存情況下被殺。當用戶回家並且必須等待時,這顯然不是很好。Android應用OOM(內存不足)的過程

在我的研究,我發現,Android的分類過程分成幾個優先級組,從最高到最低:

系統

持續

前景

可見

察覺

個一個服務

首頁

上一頁

乙服務

背景

您可以檢查哪些進程秋天通過執行其下:亞行外殼dumpsys meminfo中

最全面文檔我能找到關於這一主題是:http://developer.android.com/guide/components/processes-and-threads.html#Lifecycle

但是,它並沒有給上述所有羣體的清晰畫面。具體來說,

  1. 如何/何時被認爲是一個過程「可察覺」?有些應用程序(如Go Launcher EX),似乎已經想通了,如何保持這一類的時候不是在前臺。這樣,它不會像往常一樣死亡。他們如何做到這一點?

    我從GO桌面被認爲是前景ADB服務殼dumpsys活動找到。我可以找到關於這個主題的唯一文檔,說你需要在狀態欄中輸入持久通知。然而,Go Launcher Ex以某種方式解決了這個需求。我迷路了,至於如何: - (

  2. 什麼是「A服務」,「家」,而「B服務」之間的區別爲啓動器應用上如何

  3. 任何其他一般性的建議?可以比普通的應用程序獲得更高的優先級?我認爲這是對用戶給出一個發射應該被認爲比大多數事情的優先級更高的(除了當前的前景活動)完全合法的請求。

+0

不錯的問題!爲dumpsys添加1。 – herbertD

回答

10

回答問題1)和3)
如果你logcat -b events你可以看到那些具有優先級的應用程序確實可以創建通知。但是所有屬性(甚至contentView)都設置爲null。
所以我的研究對於同樣的問題,我只是想用它創建一個空的通知,並開始我的服務:

startForeground(42, new Notification())

就萬事大吉了:logcat的說:

I/notification_enqueue(1607): [my.testapp.TestApp,42,NULL,Notification(pri=0 contentView=null vibrate=null sound=null defaults=0x0 flags=0x40 kind=[null])] 

和dumpsys meminfo中:

... 
17539 kB: Perceptible 
    ... 
    6164 kB: my.testapp.TestApp (pid 25573) 
... 

我不認爲這是有意的,應該理解,這應該只是如果確實需要的話可以使用。我不想用這個來想象每一個糟糕的服務。

+2

感謝您的回答!我只是證實了一切,這是相當了不起的...我有點想隱藏這個答案,現在擔心每個糟糕的應用程序可能會嘗試使用這個,並完全繞過Android的內存管理:-) – dubchoi

+0

我正在使用startForeground(0,notify )並使用startForeground(1,notify)爲我工作,感謝您瞭解代碼中出現錯誤的想法。 我從來沒有想過將通知ID設置爲1或42會改變很多東西 – Diljeet

0

按照您引用的文檔,您可以嘗試啓動一個長期的服務啓動器的優先級更高,並檢查KILL次數的性能。