


下載本文檔
版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
【移動(dòng)應(yīng)用開發(fā)技術(shù)】淺談Android應(yīng)用的退出
最近在做公司的Android項(xiàng)目,在和用戶交流需求時(shí),對方提出:菜單中務(wù)必有“退出程序”一項(xiàng)。理由很簡單,我要用別的程序,你老占著我內(nèi)存干嘛。說實(shí)話,我是不想做這個(gè)的。但這肯定跟客戶解釋不通,只好硬著頭皮做。既然做了,當(dāng)然不能給個(gè)空方法了事。下面先給出解決方案,最后討論下為什么不愿意退出,僅作個(gè)人觀點(diǎn),歡迎各位指點(diǎn)。思路關(guān)于Android的退出,網(wǎng)絡(luò)上的方法很多,總結(jié)起來大概有以下幾種:使用java.lang.System類的exit(intcode)方法;更暴力的,使用android.os.Process.killProcess(myPid());使用系統(tǒng)服務(wù)ActivityManager,killBackgroudProcesses();習(xí)慣異常編程的可能會(huì)喜歡制造FATALERROR,利用Android強(qiáng)制退出;一些更為熟悉反射機(jī)制的,強(qiáng)制調(diào)用forceStopPackage()方法;自行維護(hù)一個(gè)Activity集合,在退出的時(shí)候逐一finish掉它們。這些方法各有利弊,簡單分析如下:直接的System.exit()方法:這會(huì)清理當(dāng)前進(jìn)程占用的所有資源,結(jié)束運(yùn)行的線程并殺死當(dāng)前進(jìn)程,但在應(yīng)用占用資源比較多的時(shí)候會(huì)出現(xiàn)短暫黑屏現(xiàn)象,影響用戶體驗(yàn)。注意,如果我們的Service指定了android:process,即運(yùn)行在其他線程,使用System.exit()是不會(huì)干掉這些新進(jìn)程的。killProcess()/killBackgroundProcess()方法,很明顯地,強(qiáng)行中止進(jìn)程而不允許其保存必要的狀態(tài)信息,這是不符合Android設(shè)計(jì)的,并且即使在傳統(tǒng)桌面應(yīng)用,也不推薦吧?使用反射機(jī)制的淫才,我就不想吐槽了,分明Google做API的時(shí)候已經(jīng)隱藏掉了,你非要挖出來調(diào)用,為什么吶?顯示自己看過源碼?自行維護(hù)一個(gè)Activity集合的方法看似比較溫和和可信,但是弊端也很明顯:a.每次啟動(dòng)一個(gè)Activity必須調(diào)用一次工具類,否則將導(dǎo)致程序留下一些讓用戶莫名其妙的Activity;b.這種方法只維護(hù)了Activity,但如果程序啟動(dòng)了長時(shí)間執(zhí)行的后臺線程,這些線程將一直運(yùn)行,成為名副其實(shí)的精靈線程;c.與System.exit()一樣的,對于遠(yuǎn)程進(jìn)程沒有處理。解決方案綜合以上各類方法的優(yōu)缺點(diǎn),我最后決定采用自行維護(hù)一個(gè)Activity集合的方式。packagemon.os;
importjava.util.ArrayList;
importandroid.app.Activity;
/**
*@authorFlyingcat
*@create2014-3-11
*@version1.0
*/
publicclassExitAppManager{
privatestaticArrayList<Activity>activities;//①
privatestaticfinalvoidcheck(){//②
if(activities==null){
activities=newArrayList<Activity>();
}
}
publicstaticfinalvoidrecord(Activityact){//③
check();
activities.add(act);
}
publicstaticfinalvoidexit(){
for(inti=0;i<activities.size();i++){//④
activities.get(i).finish();
}
activities=null;
System.exit(0);//⑤
}
}幾點(diǎn)注釋:很多類似的實(shí)現(xiàn)使用了單例模式,但我比較懶,不愿意增加一個(gè)額外的單例變量,使用static來替代了。①這里聲明保存Activity的ArrayList集合,之所以使用List而不是Stack,是因?yàn)榘凑誇IFO原則清理Activity時(shí)會(huì)最后清理當(dāng)前Activity,不至于讓用戶看到頻繁的Activity退出動(dòng)畫。②這里使用了一個(gè)額外的方法進(jìn)行檢查,這是和最后的null處理方法對應(yīng)的。在某些情形下,如果用戶頻繁開關(guān)應(yīng)用,可能造成類還沒有被卸載就再次運(yùn)行,靜態(tài)的List未被重新初始化??傊?,這樣是為了增加健壯性。③這個(gè)方法用于記錄Activity,很顯然,每個(gè)Activity啟動(dòng)時(shí)都應(yīng)該調(diào)用這個(gè)方法。④逐個(gè)銷毀Activity,這個(gè)沒什么好解釋的。⑤這里還是使用了System.exit(0)。因?yàn)閷?shí)際上前面已經(jīng)解釋過了,exit(0)的方法其實(shí)清理得還是比較干凈的,加上這一句可以避免因?yàn)槭韬鐾浱砑覣ctivity導(dǎo)致的bug。而且比較占用資源的Activity已經(jīng)被清理完畢,這里主要是清理線程和服務(wù)的工作。執(zhí)行這行代碼后,程序就關(guān)閉了。但是,如果有遠(yuǎn)程進(jìn)程還需要關(guān)閉,就需要增加額外的代碼了,這里不再贅述。個(gè)人看法:為什么不用退出?首先,這些內(nèi)存并沒有被浪費(fèi)。Android使用Linux內(nèi)核,采用了類似于Linux的內(nèi)存管理機(jī)制,將當(dāng)前空閑的物理內(nèi)存用于存儲(chǔ)可能再次使用的進(jìn)程。Android在官方文檔中已經(jīng)給出了說明:這樣的設(shè)計(jì)是為了下次打開這個(gè)程序時(shí)啟動(dòng)速度更快。作為一個(gè)程序員,應(yīng)該理解和支持Android這一優(yōu)秀的特性,而不是違背這個(gè)思想去設(shè)計(jì)程序。其次,駐留在內(nèi)存的后臺程序并不總會(huì)增加耗電量。不活動(dòng)的后臺進(jìn)程只是在內(nèi)存中保留了一些信息,但并不進(jìn)行任何計(jì)算(被“暫?!钡袅耍徽加肅PU,也就可以視為不耗電。既然這樣,我們也沒有必要繼續(xù)殺死程序來省電。但是,有一些應(yīng)用后臺操作確實(shí)是要耗電的,這是因?yàn)樗鼈儐?dòng)了Service或后臺線程,執(zhí)行了額外的計(jì)算操作。再次,系統(tǒng)已有應(yīng)對內(nèi)存緊缺的解
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 員工賬號授權(quán)合同范本
- 凈水商業(yè)租賃合同范本
- 賣房臨時(shí)出租合同范例
- 北京農(nóng)村租房合同范本
- 代簽訂投標(biāo)合同范本
- 雙方購車合同范本
- 單位窗簾裝修合同范例
- 代購電纜合同范本
- 廠地購買合同范本
- 吊車購銷合同范本
- 第8章-機(jī)器人傳感器-課件
- DB11∕T 1772-2020 地源熱泵系統(tǒng)評價(jià)技術(shù)規(guī)范
- 市場營銷培訓(xùn)課件
- 專題二網(wǎng)絡(luò)消費(fèi)者購買行為分析(課件)職教高考電子商務(wù)專業(yè)《網(wǎng)絡(luò)營銷實(shí)務(wù)》
- 電力市場交易
- 刑事案件偵查學(xué)習(xí)通超星期末考試答案章節(jié)答案2024年
- 職業(yè)技能等級認(rèn)定投訴舉報(bào)制度
- 垃圾分類綜合宣傳投標(biāo)方案(技術(shù)方案)
- 部編版《道德與法治》四年級下冊教材解讀與分析文檔
- 2024年保育員(初級)考試題及答案
- 甘肅省白銀市2024年中考英語真題
評論
0/150
提交評論