2011-09-21 71 views
36

task killer應用程序的有用性正在爭論,但我想知道:他們是如何工作的?如何殺死特定的進程?任務殺手如何工作?

有沒有這方面的API,如果是的話,它實際上是什麼

編輯

值得補充:我看到任務的殺手級應用上not rooted devices終止進程。所以,我想知道怎樣才能殺死Android中沒有的進程?

+1

應該對http://android.stackexchange.com/ –

+21

嗯,我認爲這是一個實際的問題屬於SO:他想知道爲什麼以及如何以編程方式殺死Android上的進程。這是我眼中的編程和一個非常令人感興趣的問題。 – theomega

+0

for android/multitasking:http://android-developers.blogspot.com/2010/04/multitasking-android-way.html –

回答

51

簡而言之,自動任務殺手通過輪詢操作系統來查找當前正在運行的進程以及他們正在使用的內存的列表。然後,無論是使用智能算法還是使用用戶輸入,任務殺手都會向系統發出一個呼叫,通知系統終止進程。有兩個apis你可以做到這一點。

他們

  • Process.killProcess(int pid)
  • ActivityManager.killBackgroundProcesses(String packageName)

這首作品通過調用Process.killProcess(int pid)其中pid是特定進程的唯一標識符。 Android以與linux相同的方式殺死進程;但是,用戶只能殺死他們擁有的進程。在Android中,每個應用都使用唯一的UID(UserID)運行。使用此應用程序的應用程序只能殺死自己的進程,因此以下內容explanation in the docs for Process.killProcess(int pid)

使用給定的PID殺死進程。請注意,雖然這個API允許我們請求基於它的PID終止任何進程,但內核將仍然強制執行標準限制,您實際上可以使用其中的殺死哪些PID。通常這意味着只有運行調用者的程序包/應用程序以及由該應用程序創建的任何其他進程的進程;共享一個通用UID的軟件包也將能夠相互殺死對方的 進程。

當調用此方法時,操作系統生成了signal併發送給進程。每當進程收到來自OS的信號時,它必須處理該信號或立即死亡。信號如SIG_KILL無法處理,並導致收件人進程立即死亡。如果你想殺死你沒有殺掉特權的進程,即它不是你的進程,那麼你必須切換用戶或升級你的特權(在android上這需要設備上的root權限)。

第二個API的工作原理是告訴內置的ActivityManager您要終止與特定軟件包相關的進程。 此API可以解決您的UID需要匹配進程的UID,因爲它需要用戶接受KILL_BACKGROUND_PROCESSES權限。此權限向操作系統發出通知,表示應用程序已被用戶批准爲任務殺手。當任務殺手想要殺死一個應用程序時,它會通知操作系統終止進程,從而允許應用程序繞過只能殺死它擁有的進程的問題。

Android Docs it says that this API actually uses the first Process.killProcess API

讓系統立即殺死與給定包關聯 所有後臺進程。這與內核查殺那些回收內存的進程相同;系統將根據需要在未來重新處理這些過程。

如果你想知道更多,我建議你閱讀有關Posix SignalsThe Linux kill command