2011-09-21 47 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