2011-09-07 86 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