Android 强大的开发支持库组件AppFromwork框架详解

 AppFromwork是一款带有多方支持的App通用开发组件,可以更快的开发android应用程序,AppFromwork能帮你解决很多在开发中出现的问题,也可以大大的提高你的开发速率,也可以支持你二次开发一款属于自己的通用App开发集成组件。

   目前该套AppFromwork框架提供的功能有:

      1.添加了“再按一次退出系统”提示,只需要继承BaseActivity将需要作出此提示的Activity中调用addFirstToast()方法即可
      2.自动检测版本提示更新
      服务器返回数据说明:例 {“flag”:1,”appversion”:最新版本号,”content”:”更新内容”,”url”:”最新版本的下载地址”} flag: “1”数据获取成功
       开启自动更新版本的功能:sp.putBoolean(SPContants.AUTO_UPLOAD,true).commit();在BaseActivity中把url和path两个变量赋上相应的值.
     3.项目统一化管理:
       Fragment继承BaseFragment Activity继承BaseActivity Assets目录的访问 对SharedPreferences做了统一化处理
      省去了findViewById和设置监听的事件的操作,只需要声明一个int[]类型的ids变量,框架会自动为该数组内的所有控件设置上监听事件
       添加了对Page页面的支持,需要 1.继承BasePage 2.在Fragment中调用showPager()显示Page页面
      该套Page的支持是参照传智播客的马伟奇老师讲的网易新闻项目作出的一套框架支持,只不过是稍稍改良了一下。
    4.对图片的优化处理:
   5.优化了BaseApadter适配器(支持数组、集合数据格式)
    6.优化了Android网络编程协议 支持get/post请求、多文件上传、下载、发送xml数据到服务器端(解决了服务器端关于Session/Cookie的问题)
    7.添加了对微信支付、支付宝支付平台开发、银联支付、百度地图SDK的支持
    8.添加了对webservice调用 、websocket消息推送的支持
    9.添加了对各种加密方式的支持(MD5/AES/SHA1/RSA)
    10.对Andriod系统底层硬件访问的支持(Bluetooth/Wifi/Sensor/NFC/GPS)
    11.提供了FinalDb类对数据库的支持,Afinal框架提供的ORM框架面向对象编程的数据库操作组件
     12.带有常用自定义View组件:圆角图片(RoundImageView) 手势图片(GestureImageView) Gif动画(GifView) 上拉加载下拉刷新ListView(PullToRefreshListView)
     13.各种工具类,详情见util包(BluetoothUtil/FieldUtils/FileUtils/Utils是内部接口,单独使用时请注意)
     14.集成二维码开发工具包(zxing框架,建议使用QrUtil类)

  别的我不多说了,给大家说说他的用法吧!

    1. 提示“再按一次退出系统”

      这个特性值得一提的是addFirstToast()方法中参数该怎么传的问题。目前还不能肯定的知道怎么写,但可以通过测试看到这个方法的参数该怎么传的问题,下面是我在调用这个功能作出的测试代码:   
      

1 ActivityManager manager = (ActivityManager) context.getSystemService(Context.ACTIVITY_SERVICE);
2         RunningTaskInfo info = manager.getRunningTasks(1).get(0);
3         String shortClassName = info.topActivity.getShortClassName();
4         System.out.println("shortClassName=" + shortClassName);
5         return shortClassName;

运行上端代码可知其实打印的结果就是你在android项目清单文件中注册activity时所用到的名字,好了,说到这儿大家也应该猜到该怎么传这个参数了。就是你在清单文件注册时android:name的值

    2.自动检测版本提示更新

      这个功能没有什么好说的,直接跟服务端的开发人员商量好前台的JSON数据格式,我要说的是上面说到的sp其实是SharedPreferences对象。

    3.项目统一化管理

      为了更好的管理你的工程,建议activity 继承BaseActivity,Fragment继承BaseFragment.这样做的目的我不说了,可以在父类中定义一些公共属性,公共方法供子类使用,其中的好处,我不多说。。。

      该套框架在这一点上提供了一个很好的东西,就是对事件监听机制的封装。说明一下它的使用方法吧!就是需要声明int[]类型的ids变量,框架会自动为该数组内的所有控件设置上监听事件
      

public int[] ids = {R.id.btn_sendWebsocket,R.id.btn_cookieSession};
    @Override
    public void onCreate(SharedPreferences sp, FragmentManager manager,
            Bundle savedInstanceState) {
        setContentView(R.layout.activity_text);
    }
    @Override
    public void onClick(View v) {
        switch (v.getId()) {
        case R.id.btn_cookieSession:
            Toast.makeText("你点击了  cookieSession  测试按钮", this, Toast.LENGTH_SHORT).show();
            break;
        case R.id.btn_sendWebsocket:
            Toast.makeText("你点击了  发送消息到服务器(WebSocket)  测试按钮", this, Toast.LENGTH_SHORT).show();
            break;
        }
    }

4.图片的优化处理

      通过FinalBitmap,imageview加载bitmap的时候无需考虑bitmap加载过程中出现的oom和android容器快速滑动时候出现的图片错位等现象。FinalBitmap可以配置线程加载线程数量,缓存大小,缓存路径,加载显示动画等。FinalBitmap的内存       管理使用lru算法,没有使用弱引用(android2.3以后google已经不建议使用弱引用,android2.3后强行回收软引用和弱引用,详情查看android Afinal框架官方文档),更好的管理bitmap内存。FinalBitmap可以自定义下载器,协议显示网络图片,                   比如ftp等。同时可以自定义bitmap显示器,在imageview显示图片的时候播放动画等(默认是渐变动画显示)。
      

private GridView gridView;
    private FinalBitmap fb;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.images);

        gridView = (GridView) findViewById(R.id.gridView);
        gridView.setAdapter(mAdapter);

        fb = FinalBitmap.create(this);//初始化FinalBitmap模块
        fb.configLoadingImage(R.drawable.downloading);
        //这里可以进行其他十几项的配置,也可以不用配置,配置之后必须调用init()函数,才生效
        //fb.configBitmapLoadThreadSize(int size)
        //fb.configBitmapMaxHeight(bitmapHeight)
    }


///////////////////////////adapter getView////////////////////////////////////////////

public View getView(int position, View convertView, ViewGroup parent) {
    ImageView iv;
    if(convertView == null){
        convertView = View.inflate(BitmapCacheActivity.this,R.layout.image_item, null);
        iv = (ImageView) convertView.findViewById(R.id.imageView);
        iv.setScaleType(ScaleType.CENTER_CROP);
        convertView.setTag(iv);
    }else{
        iv = (ImageView) convertView.getTag();
    }
    //bitmap加载就这一行代码,display还有其他重载,详情查看源码
    fb.display(iv,Images.imageUrls[position]);

 5.优化了BaseApadter适配器(支持数组、集合数据格式)

      这个特性我就不好说了,完全是为了开发方便而已,没有什么技术难点。直接给大家说一下这点特性所体现的类有哪些吧?大家可以自己查看源码了解,

    6.优化了Android网络编程协议

      这点我个人提供了两套支持,大家可以根据项目需求自定义选择

        至于com.gwm.net.support包下面的类我就不说了,是杨福海写的Afinal框架中有关Http请求的框架,重点就是FinalHttp类的使用,大家可以查阅官方文档https://github.com/yangfuhai/afinal了解,这里我做重点的是给大家说一下包

        com.gwm.net的使用方法,

       6.1 发送get请求:

AsyncTaskUtil.sendGet(url, listener, context);
AsyncTaskUtil.sendGet(url, listener, context, msg);
        参数说明:url:网络请求的地址 listener:当服务器有响应(有返回数据时)会调用该对象的onGetResult()方法,我们可以在这个方法中处理服务器返回的数据 context:上下文对象(必须是Activity的子类对象) msg:发送请求时所提示的

                             字符 

      6.2 发送post请求:

    AsyncTaskUtil.sendPost(url, params, listener, context);
    AsyncTaskUtil.sendPost(url, params, listener, context, msg);

        参数说明:params:用Map集合构造的网络请求参数(一个key对应一个value),其他的参数同get请求一样。

      6.3 文件上传    

FileUploadUtil.uploadImg(url, imageFile, context, listener)
        参数说明:imageFile:File[]类型参数,之所以声明成File[]类型,就是为了支持多文件上传。其他的参数同get请求一样。

      6.4 文件下载

FileDownLoad.down(path, url, context, listener);
        参数说明:path:下载的文件保存路径。其他的参数同get请求一样。

    7.第三方库的引入和开发支持

      在使用该点特性时,本人建议先熟读百度地图、支付宝、微信、银联支付第三方开发的官方开发文档和一些资料,再来对本套框架导入您的工程中

       7.1百度地图

       对于百度地图,我只是写了部分例子,和有关百度地图开发相关的一些方法,可以帮助大家理解百度地图的相关开发,如有疑问还请大家参照百度地图的官方开发文档。com.gwm.baidumap包中只是提供一些小例子

      7.2 微信支付    
      

WXPayInfo info = new WXPayInfo();
JSONObject data = json.getJSONObject("data");
info.prepayId = data.getString("prepayid");
info.nonceStr = data.getString("noncestr");
info.sign = data.getString("app_signature");
info.timeStamp = data.getString("timestamp");
WXPayInfo.APP_ID = data.getString("appid");
info.PARTNER_ID = data.getString("partnerid");
WXPayUtil pay = new WXPayUtil(OrderRechargeActivity.this,WXPayInfo.APP_ID);
pay.pay(info);

WXPayInfo:微信支付时所使用的实体类数据。该类中所有属性的值不可缺。至于相关属性的说明,大家可以参考微信支付的官方开发文档的说明。

      7.3 支付宝支付
      

private void Alipay() {
        final AliPayUtil alipay = new AliPayUtil(OrderRechargeActivity.this);
        if(!alipay.isInstanll()){   //判断是否安装了相关的支付宝支付插件
             return;
        }
        Map<String,String> params = new HashMap<String, String>();
        String userId = sp.getString(SharedPreferencesUtils.USERNAME, "");
        params.put("userId", userId);
        params.put("money", money);
        AsyncTaskUtil.sendPost(HttpConstant.ALI_PAY, params, new OnResultListener() {   //发送post请求到服务器获取支付宝支付时所需的一些参数信息

            @Override
            public void onGetResult(Object result, int iError) {
                try {
                    System.out.println("支付宝--->result= "+result);
                    JSONObject json = new JSONObject(result.toString());
                    int flag = json.getInt("flag");
                    if(flag == 1){
                        JSONObject data = json.getJSONObject("data");
                        order_str = data.getString("orderId");
                        String info = data.getString("sendData");  //获取服务器返回的加密后的数据,可以直接用于调起支付宝的数据
                        System.out.println("info="+info);
                        alipay.setListener(OrderRechargeActivity.this);    //设置监听,监听支付宝的订单成功和失败的状态
                        alipay.pay(info);  //调起支付宝支付插件实现支付
                    }else{
                        Toast.makeText(OrderRechargeActivity.this, "获取的数据有误", Toast.LENGTH_SHORT).show();
                    }
                } catch (Exception e) {
                    e.printStackTrace();
                }            }
        }, this, "正在充值中...");
      }

 7.4 银联支付

    大家可以直接打开UnionpayUtil.java类了解相关的使用说明。唯一一点要注意的是tn值的获取修要修改,大家可以不调用测试方法使用,注意,一定要将银联支付的测试环境改成正式的生产环境也就是该类中

    mMode的值要改成00,详情见本类中注释

     8.添加了对webservice调用 、websocket消息推送的支持

        8.1 webservice调用(com.gwm.webservice)

      使用说明:创建WebServiceUtils对象,调用setOnSoapNetWorkListener()方法设置监听,调用send方法

        8.2 websocket消息推送

           大家可以参考WebsocketUtil.java使用,该类没有封装的很深,一般都可阅读理解

            推送数据到服务器端:该类中有两个方法供大家可以根据实际需求使用

public void sendMessage(String message)
public void sendFile(File file) throws FileNotFoundException
 接受服务器端推送到客户端的消息,参照下面的代码使用

复制代码
WebSocketUtil util = new WebSocketUtil(Uri.parse(“”));
util.setListener(new WebSocketUtil.WebSocketListener() {
//当服务器推送消息到客户端是会调用该方法
@Override
public void onMessage(String message) {

        }
    });

复制代码
      9.各种加密方式的支持(详情参考util包EncryUtil.java类的使用)我已对每个方法提供了注释

     10.对Andriod系统底层硬件访问的支持(Bluetooth/Wifi/Sensor/NFC/GPS)

        10.1 Bluetooth、Wifi 详情见BluetoothUtil.java类,只需调用相关方法即可

        10.2 Sensor、NFC 在activity中调用对应的生命周期方法,再根据需求调用相关方法

        10.3 GPS 创建GPSUtil对象调用get()方法获取有关GPS的信息

     11.提供了FinalDb类对数据库的支持,Afinal框架提供的ORM框架面向对象编程的数据库操作组件

        详情见杨福海的Afinal框架有关FinalDb的使用文档

     12.带有常用自定义View组件:大家可以在github上查找一些自定义组件,我只是集成一些常用的自定义组件

     13.各种工具类,详情请参看util包

     14.二维码开发支持(QrUtil.java类的使用)

        环境的集成:

      拷贝zxing包和 libs文件夹下的zxing.jar还有res目录下的图片和布局文件、values文件夹下的文件,再调用相关方法实现二维码开发:

        生成二维码:

public static Bitmap qr_code(String string)
        扫描二维码获取二维码上的数据:(详情见QrUtil.java类的注释)

public void startCapture(Activity activity)
        在activity中重写onActivityResult()方法获取二维码上的数据。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章