最近在做一個類似與工作管理員的東西,裡面有個功能,可以通過這個管理器結束掉其他的進程。
在Android平台下,結束進程的方法還是比較多的。首先指明,此處的“結束進程”,包含了結束自身進程和結束其他進程兩個方面。通過查閱SDK文檔和網上的一些資料,自己找到一些結束進程的方法。在這裡做一些歸納和總結,文章的部分資訊有可能來自網上已有的文章和文章,由於過了比較長時間,所以若發現本文與其他文章雷同,請諒解。
一、結束一個活動Activity
要主動的結束一個活動Activity,(先強調一下,是結束一個活動,而不是進程)眾所周知,肯定是finish方法啦,這個就毋庸置疑了,而且這個方法最後會調用Activity的生命週期函數onDestroy方法,結束當前的Activity,從任務棧中彈出當前的Activity,啟用下一個Activity。當然其他的finish系列方法,我們不在這裡做詳細討論,有興趣的同學可以自己查閱一下SDK 的文檔。
二、強制結束當前的進程
強行結束當前進程有兩個方法。(呵呵,這裡就是結束進程了)
1、killProcess(int pid) 例子:android.os.Process.killProcess(android.os.Process.myPid());
對於這個方法,需要詳細解釋一下。在SDK的文檔中,解釋如下:
Kill the process with the given PID. Note that, though this API allows us to request to kill any process based on its PID, the kernel will still impose standard restrictions on which PIDs you are actually able to kill. Typically this means only the process running the caller's packages/application and any additional processes created by that app; packages sharing a common UID will also be able to kill each other's processes.
英語不好,不能準確翻譯,所以希望大家自己理解,免得對大家造成誤解。我個人對這句話的解釋就是,這個方法使用是有條件的:
a、將被殺掉的進程 和 當前進程 處於同一個包或者應用程式中;
b、將被殺掉的進程 是由當前應用程式所建立的附加進程;
c、將被殺掉的進程 和 當前進程 共用了普通使用者的UID。(這裡的普通使用者,是相對於Root許可權的使用者來說的)
2、System.exit(int code) 例子:System.exit(0);
該方法只能用於結束當前進程自身,個人覺得在程式遇到異常,無法正常執行時,可以通過這個方法強制退出。
需要注意的是,這兩個方法,會導致進程非正常退出,就是說,進程退出時不會去執行onPause、onStop和onDestroy方法,那麼進程很有可能錯過了儲存資料的機會。因此,這兩個方法最好使用在出現異常的時候!
三、結束另一個進程
要通過一個進程去結束另一個進程。在之前的SDK版本中,一直使用方法restartPackage(packageName)方法,但是在Android的開發文檔中介紹說,這個函數會導致一些問題( the previous behavior here is no longer available to applications because it allows them to break other applications by removing their alarms, stopping their services, etc.),所以建議大家使用一個新的方法:
void killBackgroundProcesses(String packageName)
由於這個方法沒有傳回值,所以我們也不知道我們的目標進程是否真的退出了。但是,我目前只發現了這個可以結束另一個進程的方法。
四、退出到主畫面(記得是對當前進程的處理)
這個方法,也是退出當前進程的一個方法。如果我們在進程中建立了很多的Activity,但是又不想關閉時去退出不在任務棧頂的Activity,那麼就可以直接使用這個方法了。這個方法是通過查閱網上資料看到的。在此先感謝 追夢人 了(他的部落格地址:http://www.cnblogs.com/yunfei181/archive/2011/01/24/1943128.html,歡迎大家去看看他的部落格)。
功能:當按下返回鍵時,就返回到主畫面,並帶有參數FLAG_ACTIVITY_CLEAR_TOP,會清理掉當前的活動。
1 @Override
2 public boolean onKeyDown(int keyCode, KeyEvent event) {
3 if (keyCode == KeyEvent.KEYCODE_BACK && event.getRepeatCount() == 0) { // 按下的如果是BACK,同時沒有重複
4 Intent home = new Intent(Intent.ACTION_MAIN);
5 home.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP);
6 home.addCategory(Intent.CATEGORY_HOME);
7 startActivity(home);
8 }
9 return super.onKeyDown(keyCode, event);
10 }
此方法確實結束了當前進程,但是通過Android平台的App Manager工具去查看的話,使用2.3.3的模擬器,會發現剛剛被結束的進程會以Cached background Process的形式存在,並且模擬器給出瞭解釋,說是為了下一次更快捷的啟動這個進程。
===============================優雅的分割線===============================
【聲明】本文系本人原創,轉載請註明文章出處:http://www.cnblogs.com/crazypebble/archive/2011/04/05/2006213.html 部落格園http://www.cnblogs.com