一個牛逼哄哄的Android架構One
One架構能幫您帶來什麼?
- One架構分為兩個項目,OneCore為核心工程,androidOne為示範項目,依賴oneCore
- One整個架構為MVC模式搭建,基于android framework為核心,內建Android世界中的主流技術選型
- 以Pragmatic風格的Android應用參考示例,是android項目最佳實踐的總結與示範
- 以“複雜的世界裡,一個就夠了”為理念,勵志幫助Android開發人員快速搭建一個簡單高效的android開發架構!
異步子產品
- 封裝EventBus類,将異步架構單獨抽出來,任何耗時操作(不僅僅是網絡請求)都可以放到異步子產品裡
- 與網絡子產品分離實作,可以直接寫單元測試類測試接口,讓接口調試更友善
- 支援多并發、取消操作
- 多個請求,一個回調接口處理,讓頁面代碼更簡潔
- 建議一般在BaseActivity、BaseFragment中實作
- 實作參考類 AsyncTaskManager.java
- 使用參考類 BaseActivity.java
- 使用參考類 BaseFragment.java
HTTP請求子產品
- 采用第三方AsyncHttpClient方案,支援http、https方式,支援get、post、put、delete方法,支援GZIP、File格式,支援Retry、Cacel政策,堪稱完美!
- 改造實作SyncHttpClient,支援同步,并支援RESTFUL風格,調接口時可直接單元測試
- 實作參考類 SyncHttpClient.java
DownloadManager資源下載下傳子產品
- 改造實作BreakpointHttpResponseHandler支援多并發、多檔案上傳、斷點續傳、暫停、繼續、删除下載下傳任務
/**
* [下載下傳器管理類,支援并發、暫停、繼續、删除任務操作以及斷點續傳]
*
DownloadManager downloadMgr = DownloadManager.getInstance();
downloadMgr.setDownLoadCallback(new DownLoadCallback(){
@Override
public void onLoading(String url, int bytesWritten, int totalSize) {
super.onLoading(url, bytesWritten, totalSize);
}
@Override
public void onSuccess(String url) {
super.onSuccess(url);
}
@Override
public void onFailure(String url, String strMsg) {
super.onFailure(url, strMsg);
}
});
//添加下載下傳任務
downloadMgr.addHandler(url);
*
**/
BluetoothManager藍牙處理子產品
/**
* [藍牙管理類]
*
*/
BluetoothManager bluetoothManager = BluetoothManager.getInstance(new BluetoothCallBack(){
@Override
public void onStateChange(int bluetoothState, String message) {
switch(bluetoothState){
//藍牙不可用
case BluetoothService.STATE_UNAVAILABLE:
NToast.shortToast(mContext, "藍牙不可用");
break;
//藍牙未連接配接
case BluetoothService.STATE_NONE:
NToast.shortToast(mContext, "藍牙未連接配接");
break;
//藍牙空閑
case BluetoothService.STATE_LISTEN:
break;
//藍牙正連接配接
case BluetoothService.STATE_CONNECTING:
NToast.shortToast(mContext, "藍牙正連接配接");
break;
//藍牙已連接配接, 當如果連接配接上了,message就是藍牙的名稱
case BluetoothService.STATE_CONNECTED:
NToast.shortToast(mContext, "藍牙已連接配接");
mBluetoothState = true;
break;
}
}
@Override
public void onResult(int requsetCode, String data) {
//回調結果在頁面顯示
}
});
//發送藍牙請求
bluetoothManager.request(SEND_INL_CODE, charStr);
//斷開
bluetoothManager.stop();
Common子產品
- 頁面堆棧管理ActivityPageManager
- 各種自定義dialog
- 支援hybrid開發
- 各種工具類
- 各種動畫效果
SharedPreferences管理
- 支援直接put、get對象。
LruCache管理
- 封裝LruCache,隻緩存CACHE_SIZE大小的數量,超過CACHE_SIZE自動釋放前面的對象,建議頁面間傳參使用。
Exception系統異常處理
- Bugtags是新一代的、專為移動測試而生的缺陷發現及管理工具。移動App內建Bugtags SDK後,測試人員就可以直接在App裡所見即所得的送出 bug,SDK會自動截屏、收集App運作時資料,如:裝置資訊,控制台資料,使用者的操作步驟等,團隊人員在Bugtags雲端高效的跟蹤及管理bug。
Parse解析管理
- 支援XML、JSON、JSOAP解析
- 一行代碼輕松轉JAVA對象
- 采用fastjson實作java、json互轉
- 采用xstream實作Java、xml互轉,支援注解解析
- 自主封裝,支援soapObject轉Java對象
CacheManager緩存管理
- 磁盤緩存,緩存對象需實作序列化接口,提供讀取、失效,清除方法。一般用于對接口資料的緩存。
/**
* 緩存使用示例
*
* @return
* @throws HttpException
*/
public AdResponse getAdList() throws HttpException {
AdResponse response = null;
RequestParams params = getRequestParams();
params.put("method", "fmms.getAdvertisementList");
params.put("data", "{}");
//根據請求得到唯一的緩存Key
String key = getCacheKey(AdResponse.class.getSimpleName());
//讀取緩存
if(CacheManager.isInvalidCache(key, INVALID_TIME_1DAY)){
response = CacheManager.readObject(key);
if(response != null && response.isSuccess()){
return response;
}
}
String result = httpManager.post(mContext, Constants.DOMAIN, getSignParams(params), ContentType);
if(!TextUtils.isEmpty(result)){
//一句話解析成對象
response = jsonToBean(result, AdResponse.class);
if(response != null && response.isSuccess()){
//擷取資料成功,寫入緩存
CacheManager.writeObject(response, key);
}
}
//最後都沒有資料,還是從緩存中取
if(response == null){
response = CacheManager.readObject(key);
if(response != null && response.isSuccess()){
return response;
}
}
return response;
}
BroadcastManager廣播管理
- 為了發送廣播更加友善,自主封裝了BroadcastManager,友善好用。
/**
* [BroadcastManager使用示例]
*
//在任何地方發送廣播
BroadcastManager.getInstance(mContext).sendBroadcast(FindOrderActivity.ACTION_RECEIVE_MESSAGE);
//頁面在oncreate中初始化廣播
BroadcastManager.getInstance(mContext).addAction(ACTION_RECEIVE_MESSAGE, new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent intent) {
String command = intent.getAction();
if(!TextUtils.isEmpty(command)){
if((ACTION_RECEIVE_MESSAGE).equals(command)){
//擷取json結果
String json = intent.getStringExtra("result");
//做你該做的事情
}
}
}
});
//頁面在ondestory銷毀廣播
BroadcastManager.getInstance(mContext).destroy(ACTION_RECEIVE_MESSAGE);
*
**/
DB子產品
- 采用GreenDao詳見ORM方案,直接實作Java Object的CURD方法就可以操作資料庫,非常好用,極力推薦。
- 實作DBManager,連擷取Dao的代碼都不用寫了,不管通過DaoGenerator生成的對象如何變化,通過DBManager可以讓你拿到任何Dao對象,進而實作資料庫操作。
- DaoGenerator工程自動生成model、dao、session對象等代碼,拷過來直接使用即可。
/**
* 資料庫示例
*/
public void testDB(){
NoteDao dao = DBManager.getInstance(getContext()).getDaoSession().getNoteDao();
//add
for(int i=0; i<=4; i++){
Note bean = new Note();
bean.setComment("comment");
bean.setDate(new Date());
bean.setText("text");
dao.insert(bean);
}
//udpate
List<Note> list = dao.loadAll();
if(!list.isEmpty()){
Note bean = list.get(2);
bean.setComment("comment_comment");
dao.update(bean);
}
//query
if(!list.isEmpty()){
for(Note note : list){
NLog.e("testDemo", note.getComment());
}
}
//delete
if(!list.isEmpty()){
dao.delete(list.get(0));
}
}
注解子產品
- 內建butterknife詳見注解架構,一個No Magic的Android注入架構,用過的人都說好,極力推薦。
支付子產品
- 內建支付寶支付和微信支付
- 支付寶示例:用戶端封裝參數,調用支付寶
String PARTNER = "2088XXXXXXXXXXXX"; String SELLER = "[email protected]"; String RSA_PRIVATE = "私鑰"; PayUtils payutils = new PayUtils(activity, PARTNER, SELLER, RSA_PRIVATE, "伺服器回調訂單位址[異步處理]"); payutils.setPayListener(new PayListener() { @Override public void onPayResult(int state, String message) { } }); try { payutils.pay("測試商品", "測試商品詳情", "0.01", "唯一訂單号,伺服器生成"); } catch (Exception e) { e.printStackTrace(); }
- 支付寶示例:伺服器封裝所有的參數,傳回url直接調用支付寶
PayUtils1 payutils= new PayUtils1(BespeakActivity.this, new PayListener() { @Override public void onPayResult(int state, String message) { switch (state) { case PayUtils1.PAY_SUC_CODE: MessageDialog dialog = new MessageDialog(mContext, getString(R.string.bespeak_order_suc)); dialog.setConfirmListener(new OnClickListener() { @Override public void onClick(View v) { BespeakActivity.this.finish(); } }); dialog.show(); break; case PayUtils1.PAY_DOING_CODE: case PayUtils1.PAY_GOODS_CODE: case PayUtils1.PAY_INIT_CODE: case PayUtils1.PAY_FAIL_CODE: NToast.shortToast(mContext, message); break; } } }); payutils.pay(res.getData().getUrl());
- 微信支付示例
PayReq payReq = res.getData().getPayReq(); payReq.packageValue = "Sign=WXPay"; IWXAPI msgApi = WXAPIFactory.createWXAPI(this, null); msgApi.registerApp(Constants.WEIXIN_APP_ID); msgApi.sendReq(payReq);
圖檔下載下傳子產品
- 采用Fresco解決方案,有關使用情況請參見Fresco詳見
- 記憶體管理、圖檔的漸進式呈現、Gif圖和WebP格式強大的特性讓你不能自拔!特性詳見
日志
- NLog日志輸出類
- config.properties檔案(assets檔案夾下)配置日志開關
#is debug mode, if debug is true that log is open, if debug is false that log is close.
debug=true
教程
- 優酷視訊教程位址,非常感謝融雲阿明的辛苦錄制!
- PPT手把手教程位址
常用網址推薦
Android開發技術周報
http://www.androiddevtools.cn/
android-studio中文站
結語
- 看到這裡,估計您和您的小夥伴們都驚呆了吧!趕快動手試試吧!
- 具體使用請參考androidOne示範工程。
- 我改變不了這個世界!這個世界也休想将我改變!
- 如果任何問題或者建議,歡迎溝通。
- QQ群:195104825
- AndroidOne GitHub位址:https://github.com/devinhu/androidone