Android進(jìn)程管理:開(kāi)發(fā)中終止進(jìn)程的方法
在Android中,直接殺死應(yīng)用的進(jìn)程通常不是推薦的做法,但有時(shí)候出于某些特定的需求(如調(diào)試或管理應(yīng)用),可能需要?jiǎng)x死相應(yīng)進(jìn)程。
- 「使用android.os.Process.killProcess()方法」:使用android.os.Process.myPid()方法獲取當(dāng)前進(jìn)程的ID,然后使用android.os.Process.killProcess()方法殺死該進(jìn)程。由于Android的安全機(jī)制,只有具有相同UID的進(jìn)程才能互相殺死。所以該方法只能用于自殺,即殺死調(diào)用的那個(gè)進(jìn)程。
int pid = android.os.Process.myPid();
android.os.Process.killProcess(pid);
- 「使用System.exit()方法」:可以終止當(dāng)前正在運(yùn)行的Java虛擬機(jī),從而實(shí)現(xiàn)程序的終止。當(dāng)Java虛擬機(jī)被終止時(shí),所有正在運(yùn)行的線程都將被立即停止,包括非守護(hù)線程,活動(dòng)所占的資源也會(huì)被釋放。調(diào)用該方法只會(huì)終止當(dāng)前Java虛擬機(jī),不會(huì)直接影響其他Android進(jìn)程。
System.exit(0);
或者:
private static final int MSG_DELAY_EXIT_APP = 0;
private static Handler mHandler = new Handler() {
public void handleMessage(android.os.Message msg) {
switch (msg.what) {
case MSG_DELAY_EXIT_APP:
Runtime.getRuntime().exit(0);
break;
}
}
};
mHandler.sendEmptyMessageDelayed(MSG_DELAY_EXIT_APP, 4000);
- 「使用ActivityManager.killBackgroundProcesses()方法」:可以強(qiáng)制關(guān)閉與指定包名有關(guān)聯(lián)的所有后臺(tái)進(jìn)程(不會(huì)殺死前臺(tái)進(jìn)程),而且只有當(dāng)系統(tǒng)資源緊張時(shí)才會(huì)有效,同時(shí)需要KILL_BACKGROUND_PROCESSES權(quán)限。這個(gè)方法只能用于他殺,即殺死其他應(yīng)用程序的進(jìn)程,而不能用于自殺。
String packageName = getPackageName(); // 獲取當(dāng)前應(yīng)用的包名
ActivityManager am = (ActivityManager) getSystemService(Context.ACTIVITY_SERVICE);
am.killBackgroundProcesses(packageName);
Android系統(tǒng)對(duì)于進(jìn)程和內(nèi)存的管理有自己的策略。如果內(nèi)存足夠,Android不會(huì)隨意殺掉任何進(jìn)程;但如果內(nèi)存不足,進(jìn)程隨時(shí)可能會(huì)被殺掉。當(dāng)內(nèi)存充足時(shí),Android會(huì)嘗試恢復(fù)之前被殺掉的進(jìn)程。對(duì)于應(yīng)用程序的開(kāi)發(fā)者來(lái)說(shuō),應(yīng)該盡量避免依賴靜態(tài)變量來(lái)存儲(chǔ)重要數(shù)據(jù),而是應(yīng)該將數(shù)據(jù)保存到文件或其他持久化存儲(chǔ)中。同時(shí)也需要注意合理地管理應(yīng)用程序的內(nèi)存使用,避免因?yàn)閮?nèi)存泄漏等問(wèn)題導(dǎo)致進(jìn)程被系統(tǒng)殺掉。