也許你可以幫忙。Android流程殺手
是否有可能獲得其在Android系統中運行的所有Processes
的名單,並殺死其中一些?我知道有一些應用程序(task managers
),但我想編寫自己的簡單應用程序。
我想編寫簡單的任務管理器,只需列出所有進程和按鈕,它們會殺死其中一些進程。
你能不能寫一些Java方法,我可以爲了獲取進程的列表,方法殺死他們打電話。或者只是給我一些建議。
也許你可以幫忙。Android流程殺手
是否有可能獲得其在Android系統中運行的所有Processes
的名單,並殺死其中一些?我知道有一些應用程序(task managers
),但我想編寫自己的簡單應用程序。
我想編寫簡單的任務管理器,只需列出所有進程和按鈕,它們會殺死其中一些進程。
你能不能寫一些Java方法,我可以爲了獲取進程的列表,方法殺死他們打電話。或者只是給我一些建議。
中的Android應用程序查殺/服務一般是非常糟糕的主意。雖然可以編寫task killer
應用程序,但不應鼓勵除開發/調試之外的任何其他應用程序。
任務管理是Android操作系統的職責,您可以看到的任務不是流程(就您在Windows任務管理器中看到的流程而言),實際上它們只有Android告訴他們可以擁有一個進程。
應用程序都是由這些任務管理工具定期壞了,因爲他們往往不能強制結束恢復,尤其是當它們忙着寫文件或使用其他資源時,他們被打死。它也讓手機用戶誤以爲上述應用實際上是運行在他們的手機上,他們通常不是。這是在[ActivityManager文檔]解釋[1]:
信息,你可以檢索有關 特定的任務,是目前 系統中的「運行」。請注意, 正在運行的任務並不意味着給定的 任務實際上有一個進程,它在 中主動運行;它只是意味着 用戶已經把它永不 關閉它,但是目前該系統 可以殺死它的過程,是 只有 爲了堅持自己的最後狀態重新啓動它的用戶 返回時。
當你看到的running
應用在像TaskKiller或快速系統信息的應用程序列表中,很多都沒有實際運行,他們只是處於暫停狀態。這些應用程序不會佔用系統資源,因爲Android已決定阻止它們,直到它們再次需要爲止。但是,當你殺死他們時,你不會給他們時間關閉乾淨的,當你下次嘗試發射他們時,你會看到一個不友好的力量關閉對話框。我看到應用程序完全崩潰,即使重新安裝也無效,因爲它們試圖讀取SD卡上損壞的文件,或者使用非官方的API調用。
總之,朋友不要讓朋友在Android中使用任務殺手。
總之,要回答你的問題,ActivityManager
是大多數這些應用程序的使用是在運行/暫停狀態列表活動。
freetaskmanager是這些task managers
在使用中的一個的例子。
// 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");
}
}
*/
這對OP來說不起作用,因爲內核阻止android.os.Process.killProcess從應用程序超出其包的範圍而殺死應用程序。 – 2012-06-14 05:23:39
通過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);
}
}
+1謝謝一堆!簡潔地寫。 – AgentKnopf 2012-04-02 21:18:28
這並不能解決問題,它顯示瞭如何殺死應用程序,而不是其他應用程序。 – 2012-10-03 17:08:31
好的,我明白了。感謝您的澄清。所以也許我會試着寫我簡單的任務管理器。 – Martin 2010-04-27 10:51:41
神奇的解釋! – 2010-04-27 14:17:12
雖然我同意查殺流程是一個糟糕的主意,但我發現在我的手機上這可能是必要的,因爲有些應用程序不能提供正確關閉自己的方式,而且我的手機可能會變得非常慢並且無法使用。使用任務殺手解決了這個問題。 – stealthcopter 2010-04-27 14:54:56