2012-01-11 46 views
15

我試圖建立在Android上的應用程序的任務的殺手型運行的任務。我可以使用ActivityManager顯示當前正在運行的任務的列表,但是在殺死任務時遇到問題。如何殺死在目前的Android

下面是我在做什麼,以獲得當前正在運行的任務列表:

ActivityManager am = (ActivityManager) context. 
      getSystemService(Activity.ACTIVITY_SERVICE); 


List<RunningTaskInfo> a=am.getRunningTasks(Integer.MAX_VALUE); 

PackageManager pack=this.getPackageManager(); 

for(int i=0;i<a.size();i++){ 

      String packageName = a.get(i).topActivity.getPackageName(); 

      Drawable d=null; 
      String appName=""; 

      try { 
       d=pack.getApplicationIcon(packageName); 

       appName=(String)  pack.getApplicationLabel(pack.getApplicationInfo(packageName,PackageManager.GET_META_DATA)); 

      } catch (NameNotFoundException e) { 
       e.printStackTrace(); 
      } 

        packName.add(packageName); //arraylist of package name 
       apps.add(appName);   // arraylist of app name 
       icons.add(d);    //arraylist of icons 
     } 

它的工作對我來說可是現在,因爲我嘗試使用killBackgroundProcesses殺任務:

am.killBackgroundProcesses(package name); 

它不起作用 。此外killBackgroundProcesses方法是那麼API 2.2級可我怎樣才能在以前的API級別,如1.6等

執行相同的任務是否有任何其他的方式來顯示當前活動的應用程序,並殺死他們。

請幫助。

非常感謝。

+0

如果((this.getIntent()= NULL)!) \t \t { \t \t \t布爾isLogout = this.getIntent()getBooleanExtra( 「關閉」,假)。 \t \t \t if(isLogout) \t \t \t // finish(); \t \t \t android.os.Process.killProcess(android.os.Process.myPid()); \t \t} – Android 2012-01-11 05:52:05

+0

我必須殺死任務而不是進程。它可以是一個任務或當前正在運行的所有任務。 – 2012-01-11 05:58:33

+0

並未有任何適當的答覆,甚至在等待了30多個小時...... :( – 2012-01-12 10:12:38

回答

21

除了Android操作系統本身,沒有人能夠殺死進程。

使用

public void restartPackage (String packageName) 

時,這個方法是由您的活動操作系統馬上打電話叫

大多數在Android Market任務殺手不殺他們剛剛重新啓動的過程中應用的

savedInstanceState並保存您想要殺死的活動狀態。現在,這個過程是

從內存中刪除,並保存OS當下次用戶啓動該活動是

會從那裏被殺害或者換句話說,開始重新啓動它state.Now。你可以從任何

驗證它任務管理器,他們不殺死進程,因爲沒有人可以這樣做。這種方法也可以在ICS中工作。

對於上述方法,您可以查看here。據我所知killBackgroundProcesses (String packageName)是API 8及以上。

+1

感謝約翰的有價值的信息,但你可以給一些更多的信息,我可以顯示當前正在運行的任務列表(不是進程),但現在要做的是殺掉它們,儘可能多的應用程序都這樣做(例如高級任務殺手),並且我嘗試了** restartPackage(String packageName)和killBackgroundProce sses(String packageName)**,但是當我執行這個操作,然後再次嘗試找到當前正在運行的任務時,它仍然顯示與之前相同數量的任務......所以應該怎樣解決這個問題。如果您對此有所瞭解,請分享。謝謝 – 2012-01-13 11:32:12

+2

在這裏,任務管理器發揮他們只是不殺的應用程序,他們只是從列表視圖中刪除的項目,這是應用程序了!我只是做了一個任務管理器,它像其他人一樣工作。它也釋放內部存儲器(RAM)。在刪除該項目之前,不要忘記調用'restartPackage(String packageNname)'。 – 2012-01-13 11:58:40

+0

好的我會嘗試上面的技巧,讓你知道結果。再次感謝... :) – 2012-01-13 12:15:32

13

概括地說,通過查詢OS爲當前運行的進程的列表和它們消耗的內存自動任務殺手的工作。然後,無論是使用智能算法還是使用用戶輸入,任務殺手都會向系統發出一個呼叫,通知系統終止進程。有兩個apis你可以做到這一點。

它們是

  • Process.sendSignal(PID,Process.SIGNAL_KILL);
  • ActivityManager.killBackgroundProcesses(PACKAGENAME)

該第一作品通過調用Process.killProcess(INT PID)其中,pid是用於特定過程的唯一標識符。 Android以與linux相同的方式殺死進程;但是,用戶只能殺死他們擁有的進程。在Android中,每個應用都使用唯一的UID,用戶ID運行。所以使用這個API一個應用程序只能殺死自己的進程,因此以下explanation in the docs for Process.killProcess(int pid):

用給定的PID殺死進程。需要注意的是,雖然該API允許 我們要求殺死基於其PID的任何過程中,內核將 仍然強加給它的PID你居然能 殺死標準的限制。通常這意味着只有運行調用者的程序包/應用程序以及由該應用程序創建的任何其他進程的進程;共享一個通用UID的軟件包也將能夠相互殺死對方的 進程。

當調用此方法時,signals由OS生成並設置爲進程。每當進程收到來自OS的信號時,它必須處理該信號或立即死亡。信號如SIG_KILL無法處理,並導致收件人進程立即死亡。如果你想殺死你沒有殺掉特權的進程,即它不是你的進程,那麼你必須使用sudo來升級你的特權(這將需要設備上的root權限)。

第二個API通過告訴ActivityManager您希望終止與特定Package相關聯的進程。 此API可以滿足您的UID匹配進程的UID的需求,因爲它需要用戶接受KILL_BACKGROUND_PROCESSES權限。此權限向操作系統發出通知,表明應用程序已被用戶認可爲任務殺手。當任務殺手想要殺死一個應用時,它會告訴操作系統解決只能殺死自己擁有的進程的問題。

In the Android Docs it says that this API actually uses the first Process.killProcess API

讓系統立即殺死與給定包關聯 所有後臺進程。這與內核查殺那些回收內存的進程相同;系統將根據需要在未來重新處理這些過程。

希望它有幫助。

+1

感謝您的答覆後,邁克,但我已經試過** ActivityManager.killBackgroundProcesses(PACKAGENAME)**。有一次我用這個方法之後,如果我調用** ActivityManager.getRunningTasks(Integer.MAX_VALUE); **,它返回的任務數與前面相同,我的意思是任務的數量永遠不會改變,無法理解它背後的原因。如果我做錯了什麼 – 2012-01-11 13:01:47

+0

嗨麥克,你有沒有爲我的上述問題的任何回覆。其實我對這個很困惑.... :( – 2012-01-12 10:11:25

6

您是否在清單文件中輸入了以下權限?

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