【发布时间】:2011-02-12 19:00:44
【问题描述】:
也许你可以帮忙。
是否可以获取所有在 Android 系统中运行的 Processes 的列表,并杀死其中一些?我知道有一些应用程序 (task managers),但我想编写自己的简单应用程序。
我想写一个简单的任务管理器,只是列出所有进程和会杀死其中一些的按钮。
你能不能写一些我可以调用的Java方法来获取进程列表,以及杀死它们的方法。或者只是给我一些建议。
【问题讨论】:
也许你可以帮忙。
是否可以获取所有在 Android 系统中运行的 Processes 的列表,并杀死其中一些?我知道有一些应用程序 (task managers),但我想编写自己的简单应用程序。
我想写一个简单的任务管理器,只是列出所有进程和会杀死其中一些的按钮。
你能不能写一些我可以调用的Java方法来获取进程列表,以及杀死它们的方法。或者只是给我一些建议。
【问题讨论】:
杀死 Android 中的应用程序/服务通常是一个非常糟糕的主意。虽然可以编写task killer 应用程序,但不应鼓励它用于开发/调试目的之外的任何事情。
任务管理是 Android 操作系统的职责,你能看到的任务不是进程(例如你在 Windows 任务管理器中看到的进程),事实上,只有当 Android 告诉他们可以拥有一个进程时,他们才会拥有一个进程。
应用程序经常被这些任务管理工具破坏,因为它们经常无法从强制终止中恢复,特别是当它们被杀死时正忙于写入文件或使用其他资源时。它还使手机用户误以为列出的应用程序实际上是在他们的手机上RUNNING,而实际上并非如此。这在 [ActivityManager 文档][1] 中有解释:
您可以检索的有关 当前正在执行的特定任务 在系统中“运行”。请注意,一个 运行任务不代表给定 任务实际有一个过程 积极奔跑;它只是意味着 用户已经去过它并且从未 关闭它,但目前系统 可能已经杀死了它的进程并且是 只保持它的最后一个状态 为了在用户重新启动它 返回。
当您在 TaskKiller 或 Quick System Info 等应用程序中看到 running 应用程序列表时,其中许多应用程序实际上并未运行,它们只是处于暂停状态。这些应用程序不会消耗系统资源,因为 Android 已决定在再次需要它们之前停止它们。但是,当您杀死它们时,您没有给它们时间干净地关闭它们,并且当您下次尝试启动它们时,您可能会看到一个不友好的强制关闭对话框。我已经看到应用程序完全崩溃,甚至重新安装也无效,因为它们试图读取 SD 卡上损坏的文件,或者它们使用非官方 API 调用。
简而言之,朋友不要让朋友在 Android 中使用任务杀手。
无论如何,为了回答您的问题,ActivityManager 是大多数这些应用程序用来列出处于运行/暂停状态的活动。
freetaskmanager 是使用中的task managers 之一。
【讨论】:
至少可以说,通过 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);
}
}
【讨论】:
// 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");
}
}
*/
【讨论】: