Android进程杀手

Mar*_*tin 15 android process

也许你可以帮忙.

是否有可能获得Processes在Android系统中运行的所有内容的列表,并杀死其中一些?我知道有一些应用程序(task managers),但我想编写自己的简单应用程序.

我想编写简单的任务管理器,只列出所有进程和按钮,它们会杀死其中的一些.

你能写一些我可以调用的Java方法来获取进程列表,以及杀死它们的方法.或者只是给我一些建议.

sea*_*ges 40

在Android中杀死应用/服务通常是一个非常糟糕的主意.虽然可以编写task killer应用程序,但不应该鼓励开发/调试之外的任何事情.

任务管理是Android O/S的责任,您可以看到的任务不是进程(例如,您在Windows任务管理器中看到的进程),事实上,当Android告诉他们时,他们只有一个进程他们可以有一个.

这些任务管理工具经常会破坏应用程序,因为它们通常无法从强制终止中恢复,特别是当它们忙于写入文件或在被杀死时使用其他资源时.它还使手机用户误以为所列出的应用实际上是在他们的手机上运行,而他们通常不会.这在[ActivityManager docs] [1]中有解释:

您可以检索有关系统中当前"正在运行"的特定任务的信息.请注意,正在运行的任务并不意味着给定的任务实际上有一个正在运行的进程; 它只是意味着用户已经转到它并且从未关闭它,但是当前系统可能已经杀死了它的进程并且只保持其最后状态以便在用户返回时重新启动它.

当您running在TaskKiller或Quick System Info等应用程序中看到应用程序列表时,其中许多应用程序实际上并未运行,它们处于暂停状态.这些应用程序不会消耗系统资源,因为Android已决定停止它们直到再次需要它们.然而,当你杀死他们时,你没有给他们时间干净地关闭,并且当你下次尝试启动它们时,你会被提出一个不友好的力量关闭对话框.我已经看到应用程序完全中断,即使重新安装无效,因为他们试图读取SD卡上的损坏文件,或者他们使用非官方的API调用.

简而言之,朋友们不要让朋友在Android中使用任务杀手.

无论如何,要回答您的问题,ActivityManager大多数这些应用程序用于列出处于运行/暂停状态的活动.

freetaskmanager是其中一个正在使用的示例task managers.

  • 虽然我同意查杀程序是一个坏主意,但我发现在我的手机上它可能是必要的,因为有些应用程序没有提供正确关闭自己的方法,而且我的手机可能变得非常缓慢和不活跃.使用任务杀手解决了这个问题. (9认同)
  • @HackNone - 如果应用程序推送服务过度消耗资源或干扰您的用户体验,请向作者报告错误并将其卸载.杀戮过程不是正常的操作 - 事实上,由于我上面解释的原因,你可能会因意外终止它们而使事情变得更糟. (6认同)
  • 神奇的解释! (4认同)
  • 我在某种程度上不同意你的观点.例如,某些应用在后台使用推送服务,这可能会消耗系统资源或干扰用户.所以我们需要杀死这些不友好的过程. (3认同)
  • 我不同意肖恩的第二行说,"虽然可以编写任务杀手应用程序,但不应该鼓励任何超出开发/调试目的的东西." 实际上,我需要为客户专门请求的应用程序做到这一点.我认为假设所有应用程序都适合普通大众消费的通用预包装盒是错误的.在我的情况下,关闭系统服务是我的应用程序可以工作的唯一方式,这对我的客户来说是一件大事. (2认同)

小智 7

    // Get currently running application processes
    List<ActivityManager.RunningAppProcessInfo> list = servMng.getRunningAppProcesses();
    if(list != null){
     for(int i=0;i<list.size();++i){
      if("com.android.email".matches(list.get(i).processName)){
       int pid = android.os.Process.getUidForName("com.android.email");
             android.os.Process.killProcess(pid);
      }else{
       mTextVIew.append(list.get(i).processName + "\n");
      }
     }
    }


    /*
    // Get currently running service
    List<ActivityManager.RunningServiceInfo> list = servMng.getRunningServices(1024);
    if(list != null){
     for(int i=0;i<list.size();++i){
      mTextVIew.append(list.get(i).service.getClassName() + "\n");
     }
    }
    */

    /*
    // Get currently running tasks
    List<ActivityManager.RunningTaskInfo> list = servMng.getRunningTasks(1024);
    if(list != null){
     for(int i=0;i<list.size();++i){
      mTextVIew.append(list.get(i).toString() + "\n");
     }
    }
    */
Run Code Online (Sandbox Code Playgroud)