一個牛逼哄哄的Android框架One

jopen 9年前發布 | 85K 次閱讀 Android Android開發 移動開發

一個牛逼哄哄的Android框架One

One框架能幫您帶來什么?

  • One框架分為兩個項目,OneCore為核心工程,androidOne為演示項目,依賴oneCore

  • One整個框架為MVC模式搭建,基于android framework為核心,集成Android世界中的主流技術選型

  • 以Pragmatic風格的Android應用參考示例,是android項目最佳實踐的總結與演示

  • 以“復雜的世界里,一個就夠了”為理念,勵志幫助Android開發人員快速搭建一個簡單高效的android開發框架!

異步模塊

  • 封裝EventBus類,將異步框架單獨抽出來,任何耗時操作(不僅僅是網絡請求)都可以放到異步模塊里

  • 與網絡模塊分離實現,可以直接寫單元測試類測試接口,讓接口調試更方便

  • 支持多并發、取消操作

  • 多個請求,一個回調接口處理,讓頁面代碼更簡潔

  • 建議一般在BaseActivity、BaseFragment中實現

HTTP請求模塊

  • 采用第三方AsyncHttpClient方案,支持http、https方式,支持get、post、put、delete方法,支持GZIP、File格式,支持Retry、Cacel策略,堪稱完美!

  • 改造實現SyncHttpClient,支持同步,并支持RESTFUL風格,調接口時可直接單元測試

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

教程

結語

  • 看到這里,估計您和您的小伙伴們都驚呆了吧!趕快動手試試吧!

  • 具體使用請參考androidOne演示工程。

  • 我改變不了這個世界!這個世界也休想將我改變!

  • 如果任何問題或者建議,歡迎溝通。

  • QQ群:195104825

項目主頁:http://www.baiduhome.net/lib/view/home/1450878694948

 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!