- 生命周期的跳轉(zhuǎn)
- 應(yīng)用調(diào)試
- fragment
- RecyclerView
- ConstrainLayout
- 雙版面主從用戶界面
- MVVM MVP
一、生命周期的跳轉(zhuǎn)
http://www.reibang.com/p/d7070d4827ba
http://www.reibang.com/p/fb44584daee3
activity 跳轉(zhuǎn)的順序是先pause當(dāng)前挂疆,啟動新界面再把之前的stop掉雁佳;
這樣設(shè)計的目的是pause已經(jīng)能釋放大量資源掀抹,為了保證界面切換的流暢度
onnewIntent啟動時機(jī)是啟動singleTop模式下的activity怜跑,或者給intent中添加一個flag后色瘩,或者activity在棧頂再啟動它又跛;
被啟動activity在棧頂?shù)膯禹樞蚴莗ause-onnewintent-onresume
被啟動activity在棧中的啟動順序是onnewIntent-onrestart-onstart-onresume
三碍拆、fragment
fragment生命周期是activity管理的,操作系統(tǒng)不關(guān)心慨蓝,所以fragment生命周期方法都是公共方法感混,activity要調(diào)用他們
1、生命周期如下:
onAttach--onCreate--onCreateView--onActivityCreated--onStart--onResume
--onPause--onStop--onDestoryView--onDestroy--onDetach
其中onAttach,onCreate,onCreagteView全部在setContentView方法中調(diào)用
2礼烈、fragment的使用
除了在xml中硬性添加fragment弧满,
唯一靈活的方法就是使用代碼添加,就是通過activity中的fragmentManager添管理fragment此熬,它會調(diào)用所管理的fragment的生命周期方法庭呜。
首先為fragment添加一個視圖容器,該容器可以用于托管其他的fragment犀忱,容器id標(biāo)識需要添加的fragment募谎,在fragmentManager管理的fragment隊列中,不同的fragment就是被容器id標(biāo)識并保存起來的阴汇,此外数冬,在設(shè)備旋轉(zhuǎn)或回收內(nèi)存時,fragmentManager能夠保存當(dāng)前隊列鲫寄,并在activity重建時恢復(fù)吉执。
3、設(shè)計思路
- 如果有比較多的細(xì)小組件需要復(fù)用地来,比較好的方法就是使用自定義view
- 一個屏幕最多使用2-3個fragment
4戳玫、fragment之間的通信
有幾種方法: - 通過fragment獲取activity實例,然后通過findFragmentbyId方法獲取其他fragment實例進(jìn)行通信
- 通過fragmentintent-->Activity-->fragmentintent
對端fragment通過getActivity獲取托管activity的信息未斑,缺陷就是拓展性差咕宿,fragment必須知道托管activity的實現(xiàn)細(xì)節(jié)。 - fragment argument
通過創(chuàng)建fragment之后,添加給activity之前府阀,給fragment添加參數(shù)為Bundle的argument缆镣,然后在fragment的生命周期方法中獲取argument
//在activity中調(diào)用fragment的生成方法,并添加bundle
public static CrimeFragment newInstance(UUID crimeId) {
Bundle args = new Bundle();
args.putSerializable(ARG_CRIME_ID, crimeId);
CrimeFragment fragment = new CrimeFragment();
fragment.setArguments(args);
return fragment;
}
//在fragment的生命周期方法中獲取bundle
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
UUID crimeId = (UUID) getArguments().getSerializable(ARG_CRIME_ID);
mCrime = CrimeLab.get(getActivity()).getCrime(crimeId);
mPhotoFile = CrimeLab.get(getActivity()).getPhotoFile(mCrime);
}
這樣做的好處在于fragment可以作為一個獨立的組件使用试浙,無需知道activity的實現(xiàn)細(xì)節(jié)董瞻。而activity知道fragment的細(xì)節(jié)是合理的。
另一個好處就是fragment的argument能夠在fragment因為設(shè)備旋轉(zhuǎn)或者內(nèi)存回收時候保存數(shù)據(jù)田巴,如果使用其他方式比如實例變量保存數(shù)據(jù)钠糊,就容易丟失。雖然fragment中也有OnSavedInstanceState(Bundle)方法壹哺,但是一般argument更方便抄伍。
參考:
http://www.reibang.com/p/7ae890863307
四、RecyclerView
參考:
http://www.reibang.com/p/0ca3944a8acd
五管宵、ConstrainLayout
是伴隨AS2.2推出的一個新布局截珍,最大的特點就是十分適合用可視化的方式編輯,它是用約束的方式排版組件箩朴,能夠有效的解決布局嵌套過多的問題岗喉。
一個控件上下左右方向各有一個約束點,通過往約束點添加約束炸庞,控件的位置就能確定
約束能相對于父控件添加沈堡,也可以相對于其他控件進(jìn)行添加
此外在Inspector中橫縱的兩條軸能改變既定約束下的控件位置
any size是用于填充滿當(dāng)前控件的約束規(guī)則,對比于用于填充滿當(dāng)前控件的父布局的match parent
guideLines能夠作為水平/垂直對齊的標(biāo)尺燕雁。
通過上述的屬性诞丽,constrainLayout能夠較為輕松的實現(xiàn)比較復(fù)雜的UI,相對于RelativeLayout更加強(qiáng)大拐格。
六僧免、雙版面主從用戶界面
http://www.reibang.com/p/3ec5d7848e31
七、MVVM捏浊、MVP懂衩、MVC
MVVM:View--(dataBinding)--ViewModel--Model
- View只負(fù)責(zé)監(jiān)聽數(shù)據(jù)變化并更新UI,不應(yīng)有任何數(shù)據(jù)邏輯操作金踪;
- ViewModel負(fù)責(zé)業(yè)務(wù)邏輯處理并和View層傳遞數(shù)據(jù)變化信息浊洞,他們之間通過dataBinding雙向通信,ViewModel沒有持有view的耦合胡岔;
- Model定義實體類法希,以及獲取業(yè)務(wù)數(shù)據(jù)模型,比如通過數(shù)據(jù)庫或者網(wǎng)絡(luò)來操作數(shù)據(jù)等靶瘸。
有那么幾個優(yōu)勢:
1苫亦、輕耦合毛肋,view和viewmodel之間沒有耦合,viewmodel不會持有view的引用
2、異步線程更新UI屋剑,UI更新不再需要切換到主線程润匙,dataBinding會自動完成
3、數(shù)據(jù)驅(qū)動唉匾,UI 的展現(xiàn)是依賴于數(shù)據(jù)的孕讳,數(shù)據(jù)的變化會自然的引發(fā) UI 的變化,而 UI 的改變也會使數(shù)據(jù) Model 進(jìn)行對應(yīng)的更新巍膘。
有這三大優(yōu)勢帶來的額外福利就是協(xié)作和單元測試方便
開發(fā)中最明顯的改變就是dataBinding讓程序員不用再寫findViewById()卫病、setText()、setOnClickListener() 這類沒有營養(yǎng)的膠水代碼典徘。
參考:
http://www.reibang.com/p/153ba1adf4cc
MVP模式:
傳統(tǒng)的MVC模式中Activity承載了太多View好Controller的功能,耦合太大益咬。
MVP中將activity解放逮诲,利用View--Presenter--Model的架構(gòu),讓業(yè)務(wù)邏輯集中到Presenter中處理幽告,View層集中處理視圖邏輯梅鹦,View和Presenter層相互引用,這樣activity就能只負(fù)責(zé)生命周期的處理冗锁。
帶來的優(yōu)勢:
- 分離了視圖邏輯和業(yè)務(wù)邏輯齐唆,降低了耦合
- Activity只處理生命周期的任務(wù),代碼變得更加簡潔
- 視圖邏輯和業(yè)務(wù)邏輯分別抽象到了View和Presenter的接口中去冻河,提高代碼的可閱讀性
- Presenter被抽象成接口箍邮,可以有多種具體的實現(xiàn),所以方便進(jìn)行單元測試