2011-09-13 47 views
13

我想殺死所有正在運行的應用程序在android.so這個任務,我實現了以下代碼。但它不起作用.App仍然在運行。如何殺死android中所有正在運行的應用程序?

ActivityManager manager = (ActivityManager) getSystemService(ACTIVITY_SERVICE); 
    for (RunningAppProcessInfo service : manager.getRunningAppProcesses()) { 
    Log.i("process name " , service.processName); 

    android.os.Process.killProcess(service.pid); 
    } 

那麼我在代碼中犯了什麼錯誤? 有什麼幫助嗎?

+0

讓我告訴你,我已經在AVD中測試過它,不是在設備上。所以有沒有什麼方法可以在真實設備上運行? –

回答

18
  • 您可以使用Process.killProcess(int pid)殺死具有相同UID您的應用程序的過程。
  • 你可以在你的清單使用ActivityManager.killBackgroundProcesses(String packageName),與KILL_BACKGROUND_PROCESSES許可(用於API> = 8)或ActivityManager.restartPackage (String packageName)(用於API < 8)殺死指定的進程,除了forground過程。

所以,如果你將要殺死所有其他進程時,你的程序是前臺進程,你會使用ActivityManager.killBackgroundProcessesActivityManager.restartPackage

List<ApplicationInfo> packages; 
    PackageManager pm; 
    pm = getPackageManager(); 
    //get a list of installed apps. 
    packages = pm.getInstalledApplications(0); 

    ActivityManager mActivityManager = (ActivityManager)context.getSystemService(Context.ACTIVITY_SERVICE); 
    String myPackage = getApplicationContext().getPackageName(); 
    for (ApplicationInfo packageInfo : packages) { 
     if((packageInfo.flags & ApplicationInfo.FLAG_SYSTEM)==1)continue; 
     if(packageInfo.packageName.equals(myPackage)) continue; 
     mActivityManager.killBackgroundProcesses(packageInfo.packageName); 
    }  

在上面的代碼段,每道工序都會被殺死,除非它是您的應用程序或系統進程的進程。
參考文獻:
How to close all active applications from my Android app?
How do task killers work?

+0

非常感謝 –

+0

@Nandlal Virani好的!請參閱我的編輯。 – hasanghaforian

+0

我不明白什麼行-------- if((packageInfo.flags&ApplicationInfo.FLAG_SYSTEM)== 1)continue;不.. !!你可以解釋一下 –

1

根據DOC enter link description here

需要注意的是,雖然該API允許我們要求殺死基於其PID任何進程 ,內核還是會徵收標準限制 上的PID你實際上能殺。通常,這意味着僅 運行呼叫者的包/應用程序,通過該應用程序

我測試它創建的任何 其他進程的過程中,只殺死進程承載我的應用程序。

+0

然後是不可能殺死其他人運行應用程序? –

+1

我做了關於殺害外部應用程序的小搜索。但是,沒有什麼有用的發現。另一方面,我們有許多任務管理器應用程序可以殺死任何外部進程。所以,這是可能的 - 但不幸的是,我現在還不知道。 – Bandzio

+0

好的,thanxdxfdsfssssssss –

5

如果設備已經過根(具有超級用戶權限),則還有另一種可能性。

您可以調用將使用su權限的外部進程。但請注意,這可能是一個糟糕的設計,因爲Android操作系統應該是唯一一個殺死進程的設計。

try { 
    Process rootProcess = Runtime.getRuntime().exec(new String[] { "su" }); 

    String command = "kill - 9 <pid>"; 

    BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(rootProcess.getOutputStream()), 2048); 
    try { 
     bw.write(command); 
     bw.newLine(); 
     bw.flush(); 
    } catch (IOException e) { 
    // Handle error 
    } 
} catch (Exception e) { 
    e.printStackTrace(); 
    // Device not rooted!    
} 
+0

我該如何實現它?它只能在真實的設備上工作嗎? –

+0

我測試了它,但仍然運行,但死亡 –

+0

您的手機必須根植 – Overblade

0

反映強制停止

ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE); Method method = Class.forName("android.app.ActivityManager").getMethod("forceStopPackage", String.class); method.invoke(am, pkgName);

你應該添加此係統權限:

android.permission.FORCE_STOP_PACKAGES

+0

android studio警告說它只會授予系統應用程序。 –

相關問題