2010-04-27 69 views
14

也許你可以幫忙。Android流程殺手

是否有可能獲得其在Android系統中運行的所有Processes的名單,並殺死其中一些?我知道有一些應用程序(task managers),但我想編寫自己的簡單應用程序。

我想編寫簡單的任務管理器,只需列出所有進程和按鈕,它們會殺死其中一些進程。

你能不能寫一些Java方法,我可以爲了獲取進程的列表,方法殺死他們打電話。或者只是給我一些建議。

回答

41

中的Android應用程序查殺/服務一般是非常糟糕的主意。雖然可以編寫task killer應用程序,但不應鼓勵除開發/調試之外的任何其他應用程序。

任務管理是Android操作系統的職責,您可以看到的任務不是流程(就您在Windows任務管理器中看到的流程而言),實際上它們只有Android告訴他們可以擁有一個進程。

應用程序都是由這些任務管理工具定期壞了,因爲他們往往不能強制結束恢復,尤其是當它們忙着寫文件或使用其他資源時,他們被打死。它也讓手機用戶誤以爲上述應用實際上是運行在他們的手機上,他們通常不是。這是在[ActivityManager文檔]解釋[1]:

信息,你可以檢索有關 特定的任務,是目前 系統中的「運行」。請注意, 正在運行的任務並不意味着給定的 任務實際上有一個進程,它在 中主動運行;它只是意味着 用戶已經把它永不 關閉它,但是目前該系統 可以殺死它的過程,是 只有 爲了堅持自己的最後狀態重新啓動它的用戶 返回時。

當你看到的running應用在像TaskKiller或快速系統信息的應用程序列表中,很多都沒有實際運行,他們只是處於暫停狀態。這些應用程序不會佔用系統資源,因爲Android已決定阻止它們,直到它們再次需要爲止。但是,當你殺死他們時,你不會給他們時間關閉乾淨的,當你下次嘗試發射他們時,你會看到一個不友好的力量關閉對話框。我看到應用程序完全崩潰,即使重新安裝也無效,因爲它們試圖讀取SD卡上損壞的文件,或者使用非官方的API調用。

總之,朋友不要讓朋友在Android中使用任務殺手。

總之,要回答你的問題,ActivityManager是大多數這些應用程序的使用是在運行/暫停狀態列表活動。

freetaskmanager是這些task managers在使用中的一個的例子。

+0

好的,我明白了。感謝您的澄清。所以也許我會試着寫我簡單的任務管理器。 – Martin 2010-04-27 10:51:41

+4

神奇的解釋! – 2010-04-27 14:17:12

+9

雖然我同意查殺流程是一個糟糕的主意,但我發現在我的手機上這可能是必要的,因爲有些應用程序不能提供正確關閉自己的方式,而且我的手機可能會變得非常慢並且無法使用。使用任務殺手解決了這個問題。 – stealthcopter 2010-04-27 14:54:56

6
// 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"); 
    } 
    } 
    */ 
+0

這對OP來說不起作用,因爲內核阻止android.os.Process.killProcess從應用程序超出其包的範圍而殺死應用程序。 – 2012-06-14 05:23:39

3

通過Java退出Android應用程序很棘手。通過過程對象接口殺死應用程序通常被認爲是壞的形式,因爲上面列出的所有原因,我不會重新粉刷它們,但我不覺得已發佈的阻止是爲了阻止你一起做這些事情,它們只是讓你意識到可能的警告。這裏有一個問題,Android必須跟蹤活動並且load/run order,因爲這些設備有一個back按鈕......所以您請盡職地致電finish()finishFromChild(childActivity),並且當用戶exits該應用程序時,您的應用程序中存在以前的活動,很高興忽略您的代碼要求退出。

有時,你只需要殺死應用程序。所以......在實施這個數字流程殺手之前,你必須做一點規劃。確保用戶不會殺死任何對您的應用至關重要的文件I/O或網絡通信。我的策略是在front load我的活動中完成負載事件或接近負載事件的所有繁重工作。

另外,我總是在用戶退出之前提示用戶,這是一個桌面應用程序用戶界面慣例,在這裏可以很好地翻譯。

上面的代碼通過調用「getUidForName」中肯綮...

這個例子捕捉從硬件後退按鈕Android原生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); 
    } 
} 
+0

+1謝謝一堆!簡潔地寫。 – AgentKnopf 2012-04-02 21:18:28

+0

這並不能解決問題,它顯示瞭如何殺死應用程序,而不是其他應用程序。 – 2012-10-03 17:08:31