2011-09-07 84 views
0

我使用ActivityManager.killBackgroundProcesses()按程序包名稱殺死進程。在我殺死一個不使用服務的應用程序(例如Calculator)之前,我可以看到TaskKiller中列出的應用程序,並且在使用killBackgroundProcesses之後,我看不到該圖標。對於使用服務的應用程序,我遇到了麻煩。即使我殺了它,我仍然可以在TaskKiller中看到它。我假設這是因爲使用START_STICKY的服務,但我怎樣才能阻止它重新啓動?你可以使用TaskKiller來終止服務(它需要一個額外的步驟,但它可以工作,所以它是可能的!)。例如,如果我嘗試殺死Pandora,音樂將停止播放,但在打開TaskKiller時我仍然可以看到服務正在運行。殺應用程序vs殺服務

我使用遍歷所有正在運行的進程,像這樣來搜索:

爲(RunningAppProcessInfo信息:activityManager.getRunningAppProcesses()){

當我發現這個過程中我要尋找我用killBackgroundProcesses。 如果我殺了一個沒有服務的應用程序,我可以運行循環,看看它不再出現在循環中。當我用服務殺死一個應用程序時,我仍然可以在循環中看到相同的應用程序。

我需要使用什麼機制來阻止服務重新啓動,如同TaskKiller所做的那樣?

請不要用典型的「你不應該這樣做」或「Android不是爲了這樣做」而回答這個問題。我的用戶要求我自動殺掉(不關閉)其他應用程序。 TaskKiller這樣做的事實意味着這是可能的。

+5

您正在攻擊的應用程序的開發人員不理解您正在嘗試執行的操作。 – CommonsWare

+0

除了使用getRunningAppProcesses()之外,還可以嘗試使用ActivityManager.getRunningServices()來查找進程。 – ciscogambo

回答

0

該文檔載明下列有關killBackgroundProcesses

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

請注意,系統將負責重新啓動服務。

因此,如果應用程序返回START_STICKY,則無法從API 8合法執行此操作。在8之前,您可以使用restartPackage,這看起來可以工作。我敢肯定,有一些沒有記錄的方式可以完成,但是如果你找到了這個方法,那麼你的應用程序可能會從市場上被撤下,因爲它會使T的作用無效。

或者,如果你讓一個根應用程序,則可能有一些會允許它,但我不能說這是肯定的,從來沒有研究什麼是能夠與根,就發展順利。

注意:雖然不應該這樣做,但這不是我想說的。我只是想說,如果你想這樣做,你將不得不打破T & Cs或考慮使它成爲一個需要root權限的應用程序。

+0

「API 8無法合法地做到這一點」 - 這是不正確的。 Taskiller和Advanced Taskiller這樣做。他們已經在我所使用的任何設備上安裝的每個Android版本上都做到了這一點。 – Luke

+0

那麼你想說一個非常受歡迎的應用程序(從未從市場拉出)違反條款和條件?他們沒有root權限,並且工作得很好。附:感謝您重複文檔。這並不像我在發佈問題之前還沒有閱讀過! – Luke

+0

您可以發送電子郵件至[email protected](Advance Task Killer的開發者)。我懷疑這會起作用。也許他使用鬧鐘來檢查頻繁並確保應用程序仍然關閉。另外,您可以查看android中內置的linux命令。也許這會起作用。 – Jakar