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

时间:2012-01-11 05:40:38

标签: android

我正在尝试在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等)中执行相同的任务。

是否有其他方法可以显示当前有效的应用并杀死它们。

请帮忙。

非常感谢。

3 个答案:

答案 0 :(得分:22)

除Android OS本身外,没有人可以杀死进程。

Android市场中的大多数任务杀手都没有杀死他们刚刚重启过程的应用程序

使用

public void restartPackage (String packageName)

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

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

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

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

验证它

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

在ICS工作。

对于上述方法,您可以查看here。据我所知,killBackgroundProcesses (String packageName)适用于API 8及更高版本。

答案 1 :(得分:13)

简而言之,自动任务杀手通过轮询操作系统来查找当前正在运行的进程及其消耗的内存列表。然后,通过智能算法或用户输入,任务杀手向系统发出呼叫,告知系统终止进程。你可以做两个apis。

他们是

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

这首先通过调用Process.killProcess(int pid)来实现,其中pid是特定进程的唯一标识符。 Android以与linux相同的方式杀死进程;但是,用户可能只会杀死他们拥有的进程。在Android中,每个应用程序都使用唯一的UID用户ID运行。因此,使用此API,应用程序只能杀死自己的进程,因此可以使用以下explanation in the docs for Process.killProcess(int pid):

  

使用给定的PID终止进程。请注意,尽管此API允许   我们要求基于其PID来杀死任何进程,内核会   仍然对您实际能够使用的PID施加标准限制   要杀了通常,这意味着只有运行调用者的进程   包/应用程序以及该应用程序创建的任何其他进程;   共享一个普通UID的软件包也可以互相杀死   过程

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

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

In the Android Docs it says that this API actually uses the first Process.killProcess API

  

让系统立即终止所有关联的后台进程   与给定的包。这与杀死那些的内核相同   回收记忆的过程;系统将负责重启   根据需要在未来进行这些过程。

希望它有所帮助。

答案 2 :(得分:6)

您是否在清单文件中输入了以下权限?

<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>