如何在安卓中杀死当前正在运行的任务

2022-09-02 11:58:31

我正在尝试在Android中构建一个任务杀手类型的应用程序。我可以使用 ActivityManager 显示当前正在运行的任务列表,但在终止任务时会遇到问题。

以下是我正在做的以获取当前正在运行的任务列表:

ActivityManager am = (ActivityManager) context.
            getSystemService(Activity.ACTIVITY_SERVICE);
List<RunningTaskInfo> a = am.getRunningTasks(Integer.MAX_VALUE);

PackageManager pack = this.getPackageManager();

for(int i = 0; i < a.size(); i++) {
    String packageName = a.get(i).topActivity.getPackageName();
    Drawable d = null;
    String appName = "";

    try {
        d = pack.getApplicationIcon(packageName);
        appName = (String)pack.getApplicationLabel(pack.getApplicationInfo(packageName,PackageManager.GET_META_DATA));
    } catch (NameNotFoundException e) {
        e.printStackTrace();
    }
    
    packName.add(packageName);  //arraylist of package name
    apps.add(appName);          // arraylist of app name
    icons.add(d);               //arraylist of icons
}

它对我有用,但现在当我试图使用killBackgroundProcesses杀死任务时:

am.killBackgroundProcesses(package name);

它不起作用 。此外,killBackgroundProcesses方法在API级别2.2中可用,那么如何在以前的API级别(例如1.6等)中执行相同的任务。

有没有其他方法可以显示当前活动的应用程序并杀死它们?


答案 1

除了Android操作系统本身之外,没有人可以杀死进程。

Android市场中的大多数任务杀手都不会杀死应用程序,他们只是重新启动该过程

通过使用

public void restartPackage (String packageName)

当此方法被您的活动调用时,操作系统立即调用

savedInstanceState并保存您要终止的活动的状态。现在这个过程是

已从内存中删除,操作系统保存其状态。现在,当用户下次启动该活动时

将从它被杀死或换句话说重新启动的地方开始。您可以从任何

任务管理器,他们不会杀死进程,因为没有人可以这样做。此方法还

在 ICS 工作。

对于上述方法,您可以在此处查看。据我所知,这是针对API 8及更高版本。killBackgroundProcesses (String packageName)


答案 2

简而言之,自动任务杀手的工作原理是轮询操作系统以获取当前正在运行的进程及其消耗的内存的列表。然后,使用智能算法或用户输入,任务杀手向系统发出调用,告诉系统终止进程。有两个 API 可以执行此操作。

他们是

  • Process.sendSignal(pid, Process.SIGNAL_KILL);
  • ActivityManager.killBackgroundProcesses(PackageName)

这首先通过调用Process.killProcess(int pid)来工作,其中pid是特定进程的唯一标识符。Android以与Linux相同的方式杀死进程;但是,用户只能杀死他们拥有的进程。在Android中,每个应用程序都使用唯一的UID,即用户ID运行。因此,使用此API,应用程序只能杀死自己的进程,因此在Process.killProcess(int pid)的文档中进行了以下解释:

使用给定的 PID 终止进程。请注意,尽管此 API 允许我们根据其 PID 请求终止任何进程,但内核仍将对您实际能够杀死的 PID 施加标准限制。通常,这意味着只有运行调用方的包/应用程序的进程以及该应用程序创建的任何其他进程;共享公共UID的包也将能够杀死彼此的进程。

当调用此方法时,信号由操作系统生成并设置为进程。每当进程从操作系统接收到信号时,它必须处理该信号或立即死亡。诸如此类的信号无法处理,并导致接收进程立即死亡。如果你想杀死你没有权限杀死的进程,即它不是你的进程,那么你必须使用sudo提升你的特权(这将需要设备上的root特权)。SIG_KILL

第二个 API 的工作原理是告诉您想要终止与特定包关联的进程。此 API 解决了 UID 与进程的 UID 匹配的需要,因为它要求用户接受KILL_BACKGROUND_PROCESSES权限。此权限向操作系统发出信号,表明用户已将应用批准为任务杀手。当任务杀手想要杀死一个应用程序时,它会告诉操作系统这样做,以解决只能杀死你拥有的进程的问题。ActivityManager

在Android Docs中,它说这个API实际上使用了第一个Process.killProcess API。

让系统立即终止与给定包关联的所有后台进程。这与内核杀死这些进程以回收内存相同;系统将负责将来根据需要重新启动这些进程。

希望它有帮助。


推荐