一個牛逼哄哄的Android框架One
一個牛逼哄哄的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模塊
-
采用GreenDaoORM方案,直接實現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 = "demo@yahoo.cn";
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);圖片下載模塊
-
采用universal-image-loader解決方案,有關使用情況請參見universal-image-loader
-
為了提供用戶體驗,建議在listview或者gridview在滑動的時候不加載圖片
refreshlistview.setOnScrollListener(new PauseOnScrollListener(ImageLoader.getInstance(), true, true));
日志
- 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手把手教程地址
結語
-
看到這里,估計您和您的小伙伴們都驚呆了吧!趕快動手試試吧!
-
具體使用請參考androidOne演示工程。
-
我改變不了這個世界!這個世界也休想將我改變!
-
如果任何問題或者建議,歡迎溝通。
-
QQ群:195104825