也许你可以提供帮助。
是否可以获取在Android系统中运行的所有Processes
的列表,并杀死其中一些?我知道有一些应用程序(task managers
),但我想编写自己的简单应用程序。
我想编写一个简单的任务管理器,只列出所有进程和按钮,它们会杀死其中一些。
你能写一些我可以调用的Java方法来获取进程列表,以及杀死它们的方法。或者只是给我一些建议。
答案 0 :(得分:40)
在Android中杀死应用/服务通常是非常糟糕的主意。尽管可以编写task killer
个应用程序,但在开发/调试之外的任何内容都不应该鼓励它们。
任务管理是Android O / S的责任,您可以看到的任务不是进程(例如,您在Windows任务管理器中看到的进程),实际上,当Android告诉他们可以拥有一个进程时,他们只有一个进程。
应用程序经常被这些任务管理工具破坏,因为它们通常无法从强制终止中恢复,特别是当它们忙于写入文件或在被杀死时使用其他资源时。它还使手机用户误以为所列出的应用实际上是在他们的手机上 RUNNING ,而他们通常不会。这在[ActivityManager docs] [1]中解释:
您可以检索有关的信息 目前的特殊任务 在系统中“运行”。注意一个 运行任务并不代表给定的 任务实际有一个过程 积极参与;它只是意味着 用户已经去过它而且永远不会 关闭它,但目前是系统 可能已经杀了它的过程而且是 只保持其最后一个状态 为了在用户时重新启动它 回报。
当您在TaskKiller或Quick System Info等应用中看到running
个应用列表时,其中许多应用实际上并未运行,它们处于暂停状态。这些应用程序不会消耗系统资源,因为Android已决定停止它们直到再次需要它们。然而,当你杀死他们时,你没有给他们时间干净地关闭,并且当你下次尝试启动它们时,你会被提出一个不友好的力量关闭对话框。我看到应用程序完全破坏,即使重新安装无效,因为他们试图读取SD卡上的损坏文件,或者他们使用非官方的API调用。
简而言之,朋友们不要让朋友在Android中使用任务杀手。
无论如何,要回答您的问题,ActivityManager
是大多数这些应用程序用来列出处于运行/暂停状态的活动的内容。
freetaskmanager是使用其中一个task managers
的示例。
答案 1 :(得分:7)
// 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");
}
}
*/
答案 2 :(得分:3)
通过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);
}
}