Android进程杀手

时间:2010-04-27 09:50:27

标签: android process

也许你可以提供帮助。

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

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

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

3 个答案:

答案 0 :(得分:40)

在Android中杀死应用/服务通常是非常糟糕的主意。尽管可以编写task killer个应用程序,但在开发/调试之外的任何内容都不应该鼓励它们。

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

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

  

您可以检索有关的信息   目前的特殊任务   在系统中“运行”。注意一个   运行任务并不代表给定的   任务实际有一个过程   积极参与;它只是意味着   用户已经去过它而且永远不会   关闭它,但目前是系统   可能已经杀了它的过程而且是   只保持其最后一个状态   为了在用户时重新启动它   回报。

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

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

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

freetaskmanager是使用其中一个task managers的示例。

答案 1 :(得分: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");
     }
    }
    */

答案 2 :(得分:3)

通过Java退出Android应用程序至少可以说是棘手的。由于上面列出的所有原因,通过Process Object界面杀死应用程序通常被认为是不好的形式,我不会重复它们,但我不觉得发布的劝阻是为了阻止你一起做这些,它们只是让你意识到可能的警告。抓住这个问题,Android必须跟踪活动和load/run order,因为这些设备有back按钮...因此您尽职地致电finish()finishFromChild(childActivity)以及当用户exits该应用,您的应用中有以前的活动,很高兴忽略您要求退出的代码。

有时,你只需杀死应用程序。所以...在实施这个数字化进程之前,你必须做一些计划。确保用户不会终止对您的应用程序至关重要的任何文件I / O或网络通信。我的策略是front load我的活动在负载事件上或附近做所有繁重的工作。

另外,我总是会在用户退出之前提示用户,这是一个在这里翻译得很好的桌面应用程序UI约定。

以上代码通过调用“getUidForName”错过了标记...

此示例从硬件后退按钮捕获Android Native back button事件,并提示用户“您确实要离开我的应用程序”,如果用户选择“是”则会杀死应用程序。

    @Override 
public boolean onKeyDown(int keyCode, KeyEvent event) {
    //Handle the back button
    if(keyCode == KeyEvent.KEYCODE_BACK) {
        //Ask the user if they want to quit
        new AlertDialog.Builder(this)
        .setIcon(android.R.drawable.exclamationpoint)
        .setTitle("Exit?")
        .setMessage("You are about to exit the Application. " + 
                     "Do you really want to exit?")
        .setPositiveButton("Yes", new DialogInterface.OnClickListener() {
             @Override
            public void onClick(DialogInterface dialog, int which) {
                //Stop the activity
                 //maintenancetabs.this.finish();
                 int pid = android.os.Process.myPid();
                 android.os.Process.killProcess(pid);
                }
         })
        .setNegativeButton("No", null)
        .show();
         return true;
    }     else {
        return super.onKeyDown(keyCode, event);
    }
 }