【问题标题】:How to kill currently running task in android如何在android中杀死当前正在运行的任务
【发布时间】:2012-01-11 05:40:37
【问题描述】:

我正在尝试在 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);

它没有用。此外,API 级别 2.2 中提供了 killBackgroundProcesses 方法,那么我如何在以前的 API 级别(例如 1.6 等)中执行相同的任务。

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

【问题讨论】:

  • if(( this.getIntent()!= null)) { Boolean isLogout=this.getIntent().getBooleanExtra("close", false); if(isLogout) //完成(); android.os.Process.killProcess(android.os.Process.myPid()); }
  • 我必须杀死任务而不是进程。它可以是当前正在运行的一项任务或所有任务。
  • 等了30多个小时也没有得到任何适当的回复...... :(

标签: java android


【解决方案1】:

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

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

通过使用

public void restartPackage (String packageName)

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

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

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

将从它被杀死或重新启动的地方开始。您可以从任何验证它

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

在 ICS 工作。

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

【讨论】:

  • 感谢 john 提供的宝贵信息,但您能否提供更多信息,因为我可以显示当前正在运行的任务列表(不是进程),但现在如何杀死它们,因为许多应用程序正在这样做(例如高级任务杀手),我也尝试过 restartPackage (String packageName) 和 killBackgroundProcesses (String packageName) ,但是当我执行此操作然后再次尝试查找当前正在运行的任务时,它仍然显示任务数量和之前一样......那么这个问题应该怎么解决呢。如果您对此有任何想法,请分享。谢谢
  • 这里任务管理器玩了个把戏,他们只是不杀死应用程序,他们只是从列表视图中删除项目,然后应用程序就消失了!!!我刚做了一个任务管理器,它像其他人一样工作。它还释放了内部存储器(RAM)。不要忘记在删除该项目之前致电restartPackage(String packageNname)
  • 好的,我会尝试上面的技巧,让你知道结果。再次感谢... :)
  • 嗨,约翰,我面临一个问题。问题是 restartPackage() 在 android 1.6 中运行良好,但在 android 2.2 中无法运行,你能告诉我为什么会这样吗?我怎样才能让我的应用在几乎所有高于 1.6 的 android os 版本中运行。
  • 只需使用killBackgroundProcesses (String packageName) 然后应用技巧。你需要给出一个 if else 语句。 id API is greater than 7 then use killBackgroundProcesses (String packageName)` 否则使用restartPackage(String packageNname)
【解决方案2】:

简而言之,自动任务杀手通过轮询操作系统以获取当前正在运行的进程列表以及它们正在消耗的内存。然后,通过智能算法或用户输入,Task Killers 向系统发出调用,告诉系统终止进程。有两个 API 可以做到这一点。

他们是

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

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

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

当调用此方法时,signals 由操作系统生成并设置给进程。每当进程从操作系统接收到信号时,它必须要么处理该信号,要么立即死亡。 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

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

希望对您有所帮助。

【讨论】:

  • 感谢迈克的回复。但我试过 ActivityManager.killBackgroundProcesses(PackageName) 。一旦我使用此方法,如果我调用 ActivityManager.getRunningTasks(Integer.MAX_VALUE); ,它会返回与以前相同数量的任务,我的意思是任务数量永远不会改变。无法理解其背后的原因。如果我做错了什么请帮忙
  • 嗨,迈克,您对我的上述问题有任何答复吗?其实我对此很困惑......:(
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2017-09-10
    • 1970-01-01
    • 1970-01-01
    • 2020-03-20
    • 1970-01-01
    • 2018-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多