2012-05-06 50 views
3

我试图写一个简单的任务杀手。我知道我不应该杀死Android中的任务,但我渴望尝试这样的事情。我有以下代码:Android任务杀手

List<RunningAppProcessInfo> procInfo = activityManager.getRunningAppProcesses(); 
for (int i = 0; i < procInfo.size(); i++) { 
    Log.v("proces " + i,procInfo.get(i).processName + " pid:" + procInfo.get(i).pid + " importance: " + procInfo.get(i).importance + " reason: " + procInfo.get(i).importanceReasonCode); 
    //First I display all processes into the log 
} 
for (int i = 0; i < procInfo.size(); i++) { 
    RunningAppProcessInfo process = procInfo.get(i); 
    int importance = process.importance; 
    int pid = process.pid; 
    String name = process.processName; 
    if (name.equals("manager.main")) { 
     //I dont want to kill this application 
     continue; 
    } 
    if (importance == RunningAppProcessInfo.IMPORTANCE_SERVICE) { 
     //From what I have read about importances at android developers, I asume that I can safely kill everithing except for services, am I right? 
     Log.v("manager","task " + name + " pid: " + pid + " has importance: " + importance + " WILL NOT KILL"); 
     continue;      
    } 
    Log.v("manager","task " + name + " pid: " + pid + " has importance: " + importance + " WILL KILL"); 
    android.os.Process.killProcess(procInfo.get(i).pid); 
} 
procInfo = activityManager.getRunningAppProcesses(); 
//I get a new list with running tasks 
for (int i = 0; i < procInfo.size(); i++) { 
    Log.v("proces after killings" + i,procInfo.get(i).processName + " pid:" + procInfo.get(i).pid + " importance: " + procInfo.get(i).importance + " reason: " + procInfo.get(i).importanceReasonCode); 
} 

我在这里的问题是,当我执行这个代码,我首先得到的所有任务列表,这就是好的。我在日志中看到几行:

Sending signal. pid: (processId) SIG: 9 

我认为这是一个信号死亡。但是在我的代码结束时,当我显示所有正在运行的进程时,列表与以前一样,没有任何任务被杀死。任何ide为什么?谢谢!

回答

1

你不能杀死其他任务,因为内核会强制执行权限。试试这个:

ActivityManager activityManager = (ActivityManager) context.getSystemService("activity"); 
activityManager.restartPackage(packageName); 

你需要在清单以下权限:

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

编辑:

其实restartPackage已被弃用。请改用killBackgroundProcesses()!

2

为了达到最好的结果形式killProcess,尝试调用killProcess许多times.as

for (int i = 0; i < 10; i++) 
{ 
android.os.Process.killProcess(procInfo.get(i).pid); 
} 

注:

版本2.2 - killBackgroundProcesses:“这是一样的内核杀死这些进程回收内存;系统将根据需要在未来重新启动这些进程。“

ActivityManager am = (ActivityManager)getSystemService(ACTIVITY_SERVICE); 
am.killBackgroundProcesses("com.est.testetst"); 

必需的权限:

android.Manifest.permission.KILL_BACKGROUND_PROCESSES 

版本2.1 - restartPackage - ”此方法已不(适用于版本低于2.2 这是现在只是killBackgroundProcesses的包装。 (字符串);此处的行为不再适用于应用程序,因为它允许他们通过删除警报,停止其服务等来中断其他应用程序。“

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); 
    am.restartPackage(getPackageName()); 

必需的权限:

<uses-permission android:name="android.permission.RESTART_PACKAGES" /> 
+0

谢谢,我去了killBackgroundProcesses,它似乎是工作的罚款 –