Skip to content

One整个框架为MVC模式搭建,基于android framework为核心,集成Android世界中的主流技术选型, 以Pragmatic风格的Android应用参考示例,是android项目最佳实践的总结与演示。 以“复杂的世界里,一个就够了”为理念,励志帮助Android开发人员快速搭建一个简单高效的android开发框架。

Notifications You must be signed in to change notification settings

dongguagege/androidone

 
 

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

一个牛逼哄哄的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模块

  • 采用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

##教程

##常用网址推荐 Android开发技术周报

http://www.androiddevtools.cn/

android-studio中文站

##结语

  • 看到这里,估计您和您的小伙伴们都惊呆了吧!赶快动手试试吧!

  • 具体使用请参考androidOne演示工程。

  • 我改变不了这个世界!这个世界也休想将我改变!

  • 如果任何问题或者建议,欢迎沟通。

  • QQ群:195104825

  • AndroidOne GitHub地址:https://github.com/devinhu/androidone

About

One整个框架为MVC模式搭建,基于android framework为核心,集成Android世界中的主流技术选型, 以Pragmatic风格的Android应用参考示例,是android项目最佳实践的总结与演示。 以“复杂的世界里,一个就够了”为理念,励志帮助Android开发人员快速搭建一个简单高效的android开发框架。

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Java 95.6%
  • FreeMarker 3.3%
  • Other 1.1%