【问题标题】:Android process killerAndroid进程杀手
【发布时间】:2011-02-12 19:00:44
【问题描述】:

也许你可以帮忙。

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

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

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

【问题讨论】:

    标签: android process


    【解决方案1】:

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

    任务管理是 Android 操作系统的职责,你能看到的任务不是进程(例如你在 Windows 任务管理器中看到的进程),事实上,只有当 Android 告诉他们可以拥有一个进程时,他们才会拥有一个进程。

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

    您可以检索的有关 当前正在执行的特定任务 在系统中“运行”。请注意,一个 运行任务不代表给定 任务实际有一个过程 积极奔跑;它只是意味着 用户已经去过它并且从未 关闭它,但目前系统 可能已经杀死了它的进程并且是 只保持它的最后一个状态 为了在用户重新启动它 返回。

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

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

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

    freetaskmanager 是使用中的task managers 之一。

    【讨论】:

    • 好的,我明白了。谢谢你的澄清。所以也许我会尝试编写我的简单任务管理器。
    • 虽然我同意杀死进程是一个坏主意,但我发现在我的手机上它可能是必要的,因为某些应用程序不提供正确关闭自己的方法,我的手机可能会变得非常缓慢且反应迟钝.使用任务杀手解决了这个问题。
    • 我在某种程度上不同意你的看法。例如,一些应用程序在后台使用推送服务,这可能会消耗系统资源,或干扰用户。所以我们需要杀死这些不友好的进程。
    • @HackNone - 如果应用推送服务过度消耗资源或干扰您的用户体验,请向作者报告错误并卸载它。杀死进程不是正常操作 - 事实上,由于我上面解释的原因,您可能会意外终止它们,从而使事情变得更糟。
    • 我不同意 Sean 的第二行所说的,“虽然可以编写任务杀手应用程序,但不应鼓励将其用于开发/调试目的之外的任何事情。”实际上,对于客户特别要求的应用程序,我只需要这样做。我认为假设所有应用程序都放在一个通用的预包装盒中以供公众大量使用是错误的。就我而言,关闭系统服务是我的应用程序可以工作的唯一方法,这对我的客户来说意义重大。
    【解决方案2】:

    至少可以说,通过 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);
        }
     }
    

    【讨论】:

    • 这不回答问题,它显示了如何杀死应用程序,而不是其他应用程序。
    【解决方案3】:
        // 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");
         }
        }
        */
    

    【讨论】:

    • 这对 OP 不起作用,因为内核会阻止 android.os.Process.killProcess 杀死超出其包范围的应用程序。
    猜你喜欢
    • 1970-01-01
    • 2012-12-05
    • 2011-11-03
    • 2019-12-25
    • 2013-05-26
    • 2023-04-02
    • 2022-01-18
    • 1970-01-01
    • 2017-04-10
    相关资源
    最近更新 更多