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

Din*_*rma 16 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
        }
Run Code Online (Sandbox Code Playgroud)

它对我有用但现在我正在尝试使用killBackgroundProcesses杀死任务:

am.killBackgroundProcesses(package name);
Run Code Online (Sandbox Code Playgroud)

那没起效 .此外,killBackgroundProcesses方法在API级别2.2中可用,那么我如何在以前的API级别(如1.6等)中执行相同的任务.

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

请帮忙 .

非常感谢.

Sun*_*nny 22

除了Android OS本身,没有人可以杀死进程.

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

通过使用

public void restartPackage (String packageName)
Run Code Online (Sandbox Code Playgroud)

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

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

从内存中删除并将操作系统保存为状态.现在下次用户启动该活动时

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

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

在ICS工作.

对于上述方法,你可以在这里看看 .据我所知 killBackgroundProcesses (String packageName),API 8及更高版本.

  • 在这里,任务管理员发挥一个技巧,他们只是不杀死应用程序,他们只是从列表视图中删除该项目,该应用程序已经消失!我刚刚创建了一个任务管理器,它像其他人一样工作.它还释放内部存储器(RAM).在删除该项之前不要忘记调用`restartPackage(String packageNname)`. (2认同)

小智 13

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

他们是

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

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

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

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

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

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

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

希望能帮助到你.


小智 6

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

<uses-permission android:name="android.permission.GET_TASKS"/>
<uses-permission android:name="android.permission.KILL_BACKGROUND_PROCESSES"/>
Run Code Online (Sandbox Code Playgroud)