2012-05-06 52 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,它似乎是工作的罰款 –