開發(fā)Android時(shí),我們通常會(huì)為了更合理绢慢,高效灿渴,優(yōu)質(zhì)的開發(fā)項(xiàng)目,并不是上來就直接開始開發(fā)功能胰舆,而是會(huì)編寫一些暫時(shí)與功能無關(guān)的代碼骚露,這些操作被稱作搭建自己應(yīng)用程序的框架。一個(gè)優(yōu)質(zhì)的項(xiàng)目必定有一個(gè)精妙的框架缚窿。那么對(duì)于初學(xué)者而言棘幸,Android應(yīng)用框架到底應(yīng)該如何搭建,搭建的步驟是什么倦零,搭建過程中需要注意一些什么误续?
在搭建android應(yīng)用框架前,我們首先應(yīng)該清楚的就是光绕,這個(gè)框架需要達(dá)到什么效果女嘲,主要有以下三點(diǎn):
1) 降低項(xiàng)目的復(fù)雜性畜份;
2) 易擴(kuò)展诞帐、易修改、可重用性強(qiáng)爆雹、可維護(hù)性強(qiáng)停蕉;
3) 職責(zé)單一,功能清晰钙态;
明確了要達(dá)到的效果后慧起,就著手開始搭建應(yīng)用框架吧,主要有以下幾個(gè)步驟:
android項(xiàng)目工程搭建
在搭建工程結(jié)構(gòu)的時(shí)候可以盡量抽取一些共用的東西册倒,例如蚓挤,數(shù)據(jù)庫(kù)操作、base、task灿意、事件觀察者估灿、通用的工具類、android UI公共組件等等缤剧,這些東西應(yīng)該表現(xiàn)在代碼結(jié)構(gòu)中馅袁。
這些包名的作用一目了然,在別人接手這個(gè)項(xiàng)目的時(shí)候就會(huì)相對(duì)簡(jiǎn)單荒辕。
adapter適配器汗销,如果業(yè)務(wù)復(fù)雜,根據(jù)不同的業(yè)務(wù)可以添加子包來進(jìn)行分類抵窒;
base用來存放View的基類弛针,例如BaseAcitivity、BaseFragment李皇,甚至可以添加某些不同actionbar主題的Base類钦奋;
common當(dāng)然是存放一些共用的配置類信息,常量等等疙赠;
controller控制器付材,將一部分的業(yè)務(wù)類需求放到里面,充當(dāng)db和View交互的中間層圃阳,減少Activity中業(yè)務(wù)的復(fù)雜性厌衔;
event觀察者模式,事件通知捍岳;
task一些AsyncTask任務(wù)類富寿;
view一些自定義組件;
vo值對(duì)象锣夹,其實(shí)就是給各個(gè)組件使用的對(duì)象页徐,比如ListView的Item對(duì)象等等。
另外银萍,根據(jù)自己的一些業(yè)務(wù)需求变勇,我們可能需要單獨(dú)的抽取一些核心的包類。比如贴唇,理財(cái)類軟件在搭建工程結(jié)構(gòu)的時(shí)候搀绣,可以單獨(dú)抽出了2個(gè)JS相關(guān)的核心包類:
AppContext的處理
Application本身在一個(gè)應(yīng)用中只會(huì)存在一個(gè)實(shí)例,所以它一般用來存儲(chǔ)一些全局的變量和一些只需要處理一次的數(shù)據(jù)戳气。
context的管理 链患,和BaseActivity組合使用,將每一個(gè)Activity放到一個(gè)列表中瓶您,需要的時(shí)候直接使用即可麻捻;
初始化和記錄一些app信息纲仍,例如app的版本信息、設(shè)備信息等等贸毕;
初始化特定的業(yè)務(wù)需求巷折,例如有盟統(tǒng)計(jì)類、分享SDK崖咨、推送等等锻拘;
記錄應(yīng)用啟動(dòng)次數(shù)、是否第一次安裝等等击蹲,如果在第一個(gè)版本不加署拟,到后面版本使用次記錄會(huì)很麻煩;
記錄是否開啟處于調(diào)試模式歌豺,在輸出日志推穷、錯(cuò)誤消息的時(shí)候有用。
public final static boolean DEBUG=BuildConfig.DEBUG;
Base的處理
對(duì)BaseActivity的處理好壞一定程度上會(huì)影響項(xiàng)目的代碼可讀性类咧,在Base里面做一些規(guī)范化處理將會(huì)大大減少代碼的書寫量和提高可讀性馒铃。
將其Base類定義成抽象類,增加一些抽象方法痕惋,例如findView的處理郭赐、onClick的處理宪巨、初始化數(shù)據(jù)的處理衰粹。例如可以重載setContentView方法來規(guī)范子類的行為:
@Override
public void setContentView(int layoutResID) {
super.setContentView(layoutResID);
findView();
initView();
setOnClick();
}
/**
* 獲取布局控件
*/
protected abstract void findView();
/**
* 初始化View的一些數(shù)據(jù)
*/
protected abstract void initView();
/**
* 設(shè)置點(diǎn)擊監(jiān)聽
*/
protected abstract void setOnClick();
通過這種規(guī)范可以大大減少后期代碼的混亂愈腾,onCreat方法中存在大量雜亂無章的代碼;
定義一些ActionBar上面的保護(hù)類方法,比如返回按鈕堕虹、下拉事件等等;
數(shù)據(jù)庫(kù)的處理
可以在處理數(shù)據(jù)庫(kù)的時(shí)候采用ContentProvider的方式卧晓,這個(gè)方式有2個(gè)優(yōu)點(diǎn):
1)采用URI的方式訪問,更加符合我們的使用習(xí)慣赴捞;
2)隨時(shí)可以提供給其它應(yīng)用訪問數(shù)據(jù)庫(kù)逼裆;
圖片的處理
對(duì)圖片處理的文章很多,其實(shí)你只要把基本的一些開源框架原理搞清楚赦政,對(duì)普通應(yīng)用其實(shí)足夠了胜宇。這里就不在贅述。