五種布局
Android中的五種布局分別為 FrameLayout 、 LinearLayout 想际、 AbsoluteLayout 划栓、 RelativeLayout 、 TableLayout 全都繼承自ViewGroup损姜。在整體繪制效率沒(méi)有絕對(duì)的最小饰剥,最好結(jié)合ui進(jìn)行調(diào)整開(kāi)發(fā)。從代碼的上看摧阅,個(gè)人感覺(jué)繪制效率是:
FrameLayout>RelativeLayout>LinearLayout>TableLayout>AbsoluteLayout汰蓉。
Activity生命周期
- 啟動(dòng)Activity: onCreate()->onStart()->onResume()
其中需要注意的是真正的visble的時(shí)間節(jié)點(diǎn)并不是以上三個(gè)生命周期方法而是onWindowFocusChanged()方法,這個(gè)方法在界面visble時(shí)調(diào)用棒卷,很多App在做閃屏頁(yè)動(dòng)畫(huà)會(huì)在這里調(diào)用方法執(zhí)行顾孽,當(dāng)然也可以在這里調(diào)用getHeight()或getWidth方法獲取高度及控件寬度祝钢。(hint: 這里的onWindowFocusChanged()會(huì)在執(zhí)行生命周期時(shí)多次調(diào)用,使用時(shí)需要注意調(diào)用次數(shù)問(wèn)題) - 其他狀態(tài):
1.當(dāng)Activity從前臺(tái)切換到后臺(tái)時(shí):onPause()->onStop;
2.當(dāng)Activity從后臺(tái)切換到前臺(tái)時(shí):onRestart()->onStart()->onResume;
3.當(dāng)Activity在后臺(tái)運(yùn)行時(shí)若厚,由于內(nèi)存不足被殺死后拦英,由于在棧內(nèi)存中依舊存有Activity的引用,所以會(huì)重新創(chuàng)建Activity并啟動(dòng)Activity测秸;
4.鎖屏onPause()->onStop();
5.解鎖onStart()->onResume(); (hint:沒(méi)有重走onRestart())
Acitvity的啟動(dòng)模式設(shè)置(即通過(guò)xml的標(biāo)簽來(lái)改變?nèi)蝿?wù)棧的默認(rèn)行為)
我們都知道棧的數(shù)據(jù)結(jié)構(gòu)是FILO即先進(jìn)后出疤估,所以Android中Activity中的任務(wù)棧的默認(rèn)行為也是如此,但是我們可以通過(guò)修改其啟動(dòng)時(shí)模式來(lái)進(jìn)行修改他的規(guī)則來(lái)適應(yīng)我們的需求霎冯。
- standard:標(biāo)準(zhǔn)模式铃拇,就是默認(rèn)的模式無(wú)需設(shè)置即為此模式,走onCreate()->onStart()->onResume() 沈撞;
- singleTop:棧頂復(fù)用模式慷荔,這個(gè)模式指當(dāng)已經(jīng)設(shè)置了singleTop的Activity在棧頂了,那么我們新啟動(dòng)這個(gè)Activity時(shí)关串,不會(huì)重走創(chuàng)建這個(gè)Activity的生命周期方法拧廊,而是重新調(diào)用原Activity進(jìn)行啟動(dòng),且執(zhí)行onNewIntent()方法晋修,如果這個(gè)Activity不再棧頂那么他的就和standard模式一樣吧碾;
- singTask:棧內(nèi)復(fù)用模式,在這個(gè)模式下的Activity墓卦,當(dāng)啟動(dòng)他的時(shí)候會(huì)清空任務(wù)棧倦春,并執(zhí)行onNewIntent()方法,保持singTask模式下的Activity在棧頂落剪;
- singInstance:簡(jiǎn)單的說(shuō)是新建一個(gè)任務(wù)棧來(lái)存放新的被singTask修飾的Activity與之前的不在同一個(gè)任務(wù)棧中睁本,所以在這個(gè)任務(wù)棧中,所有的創(chuàng)建該Activity的請(qǐng)求皆無(wú)法創(chuàng)建新的Activity忠怖,除非該任務(wù)棧銷毀(加強(qiáng)版singTask模式)呢堰;
在這四種啟動(dòng)模式中,有很多時(shí)候沒(méi)法完全適應(yīng)需求凡泣,或者多個(gè)Activity的啟動(dòng)模式有所沖突枉疼,所以有時(shí)候可以封裝Activity的啟動(dòng)方法,在代碼中設(shè)置啟動(dòng)模式(hint:代碼設(shè)置中沒(méi)有singTask模式的設(shè)置鞋拟,可以使用intent的flag設(shè)置:
intent.setFlags(intent.FLAG_ACTIVITY_CLEAR_TOP);
intent.addFlags(Intent.FLAG_ACTIVITY_SINGLE_TOP);
)
Activity數(shù)據(jù)恢復(fù)方案
當(dāng)一個(gè)不在棧頂?shù)腁ctivity長(zhǎng)時(shí)間沒(méi)有重新回到棧頂骂维,那么可能就會(huì)被系統(tǒng)回收,當(dāng)我們需要他重新回到棧頂時(shí)贺纲,執(zhí)行的就不是onRestart()方法而是onCreate()方法了航闺,這時(shí)候我們需要進(jìn)行數(shù)據(jù)的恢復(fù)使用onSaveInstanceState()這個(gè)方法進(jìn)行恢復(fù),這個(gè)方法可以存放Bundle,可以在onCreate恢復(fù)數(shù)據(jù)潦刃。
需要注意的是每個(gè)Activity的銷毀不一定都會(huì)執(zhí)行onSaveInstanceState方法侮措,但是onSaveInstanceState的調(diào)用遵循一個(gè)重要原則,即當(dāng)系統(tǒng)“未經(jīng)你許可”時(shí)銷毀了你的activity福铅,則onSaveInstanceState會(huì)被系統(tǒng)調(diào)用萝毛,這是系統(tǒng)的責(zé)任,因?yàn)樗仨氁峁┮粋€(gè)機(jī)會(huì)讓你保存你的數(shù)據(jù)(當(dāng)然你不保存那就隨便你了)滑黔。另外笆包,需要注意的幾點(diǎn):
- 每個(gè)View都默認(rèn)實(shí)現(xiàn)了onSaveInstanceState()方法,用來(lái)恢復(fù)View的狀態(tài)略荡,但是我們需要給View一個(gè)唯一的ID庵佣,如果沒(méi)有唯一的ID是沒(méi)有辦法存儲(chǔ)他的狀態(tài)的;
- 我們?cè)谥貙?xiě)View的onSaveInstanceState()時(shí)需要執(zhí)行父類View的onSaveInstanceState()方法在執(zhí)行我們的自定義方法汛兜,一般很少去重寫(xiě)這個(gè)方法巴粪,但是在某些特定需求時(shí)也需要去進(jìn)行重寫(xiě);
- 這個(gè)方法中不要試圖去存儲(chǔ)永久性數(shù)據(jù)粥谬,因?yàn)槟悴⒉恢浪麍?zhí)不執(zhí)行肛根,同時(shí)他的執(zhí)行時(shí)間點(diǎn)可能在onPause之前也可能在onPause之后,但是肯定在onStop之前漏策;
Fragment的生命周期
Fragment的生命周期只提出注意事項(xiàng)派哲,在執(zhí)行Activity的onCreate()方法時(shí),F(xiàn)ragment執(zhí)行了onAttach()->onCreate()->onCreateView()->onViewCreated方法掺喻,當(dāng)Activity的onCreate方法執(zhí)行完成后回調(diào)執(zhí)行了Fragment的onActivityCreated()方法芭届,后面就是與Activity對(duì)應(yīng)的生命周期方法了。
Service的兩種啟動(dòng)方法感耙,有什么區(qū)別
1.在Context中通過(guò)public boolean bindService(Intent service,ServiceConnection conn,int flags) 方法來(lái)進(jìn)行Service與Context的關(guān)聯(lián)并啟動(dòng)褂乍,并且Service的生命周期依附于Context,如果與Context關(guān)聯(lián)的對(duì)象被銷毀了,那么這個(gè)Service也會(huì)被銷毀即硼。
2.通過(guò)public ComponentName startService(Intent service)方法去啟動(dòng)一個(gè)Service逃片,此時(shí)Service的生命周期與啟動(dòng)它的Context無(wú)關(guān)。
在這里我們需要注意的事只酥,一般后臺(tái)下載等創(chuàng)建子線程的任務(wù)都需要使用非綁定的Service褥实,因?yàn)樵揝erive可以一直存在,所以可以獲取線程的引用层皱,可以隨時(shí)進(jìn)行暫停,開(kāi)始赠潦,終止等操作叫胖。
如何服務(wù)如何常駐后臺(tái)
我們不做流氓軟件,這里不做討論她奥。
動(dòng)畫(huà)
動(dòng)畫(huà)主要是Api的調(diào)用及每個(gè)動(dòng)畫(huà)的回調(diào)進(jìn)行連續(xù)的動(dòng)畫(huà)實(shí)現(xiàn)瓮增,有tween動(dòng)畫(huà)怎棱,frame動(dòng)畫(huà)及PropertyAnimation動(dòng)畫(huà)。其中需要注意的事绷跑,動(dòng)畫(huà)執(zhí)行的速率問(wèn)題拳恋,即interpolator屬性,有默認(rèn)的實(shí)現(xiàn)調(diào)用即可砸捏,也可以自定義執(zhí)行速率谬运,這里不做詳細(xì)論述。
Android的數(shù)據(jù)存儲(chǔ)形式
Android存儲(chǔ)方式有5種垦藏,針對(duì)每一種說(shuō)說(shuō)注意事項(xiàng):
- SQLite:SQLite是一個(gè)輕量級(jí)的數(shù)據(jù)庫(kù)梆暖,支持基本的SQL語(yǔ)法,Android中有SQLiteDatabase的類掂骏,封裝了一些操作數(shù)據(jù)庫(kù)的api轰驳。同時(shí)市面上也有很多SQLite的框架,ORMLite弟灼、GreenDao等级解,當(dāng)然也可以自行封裝數(shù)據(jù)庫(kù)框架。在ORMLite和GreenDao中田绑,ORMLite是基于ORM的映射實(shí)現(xiàn)的所以效率較低勤哗,但功能完善,易用性強(qiáng)辛馆。相對(duì)的GreenDao引入文件小俺陋,效率高,但是缺點(diǎn)也很明顯昙篙,功能不完善腊状,易用性差。個(gè)人推薦還是使用ORMLite苔可,GreenDao坑太多缴挖,或者自己封裝也是不錯(cuò)的選擇。
- SharedPreference:這個(gè)常常用來(lái)做一些標(biāo)記性的存儲(chǔ)或者簡(jiǎn)單的數(shù)據(jù)存儲(chǔ)焚辅,諸如登錄狀態(tài)映屋,用戶號(hào)碼等,沒(méi)什么需要注意的點(diǎn)同蜻。
- File:即I/O存儲(chǔ)方式棚点,這里可以存儲(chǔ)大數(shù)據(jù)量文件。注意點(diǎn)是需要注意垃圾文件的清理湾蔓。諸如拍照后或者直接選取上傳經(jīng)過(guò)壓縮的圖片后產(chǎn)生的垃圾文件瘫析,需要清理掉(畢竟用戶不需要)徊哑,當(dāng)然數(shù)據(jù)更新也是難點(diǎn)熙兔;
- ContentProvider:內(nèi)容提供者但壮,Android四大組件之一浦译,很多人寫(xiě)的數(shù)據(jù)庫(kù)框架是通過(guò)ContentProvider來(lái)提供數(shù)據(jù)的,參考api也可以自己實(shí)現(xiàn)該功能≌认海現(xiàn)在主要是系統(tǒng)使用烂瘫,可以通過(guò)每個(gè)ContentProvider對(duì)外提供一個(gè)公共的URI獲取系統(tǒng)數(shù)據(jù)(例如音頻,視頻奇适,圖片和通訊錄)坟比。