AndroidOne一个很牛逼的框架

一个牛逼哄哄的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支持多并发、多文件上传、断点续传、暂停、继续、删除下载任务
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
/**
  * [下载器管理类,支持并发、暂停、继续、删除任务操作以及断点续传]
  *
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蓝牙处理模块

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
/**
  * [蓝牙管理类]
  *
  */
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缓存管理

  • 磁盘缓存,缓存对象需实现序列化接口,提供读取、失效,清除方法。一般用于对接口数据的缓存。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
/**
   * 缓存使用示例
   *
   * @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,方便好用。
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
/**
   * [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对象等代码,拷过来直接使用即可。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
/**
  * 数据库示例
  */
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注入框架,用过的人都说好,极力推荐。

支付模块

  • 集成支付宝支付和微信支付

    • 支付宝示例:客户端封装参数,调用支付宝
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
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直接调用支付宝
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
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());

微信支付示例
?
1
2
3
4
5
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一个很牛逼的框架)