Android 強大的開發支持庫組件AppFromwork框架詳解
下載地址:http://pan.baidu.com/s/1bbeOI
各位瀏覽的朋友,如需轉載,請注明出處,否者封鎖下載地址
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變量,框架會自動為該數組內的所有控件設置上監聽事件

1 public int[] ids = {R.id.btn_sendWebsocket,R.id.btn_cookieSession}; 2 @Override 3 public void onCreate(SharedPreferences sp, FragmentManager manager, 4 Bundle savedInstanceState) { 5 setContentView(R.layout.activity_text); 6 } 7 @Override 8 public void onClick(View v) { 9 switch (v.getId()) { 10 case R.id.btn_cookieSession: 11 Toast.makeText("你點擊了 cookieSession 測試按鈕", this, Toast.LENGTH_SHORT).show(); 12 break; 13 case R.id.btn_sendWebsocket: 14 Toast.makeText("你點擊了 發送消息到服務器(WebSocket) 測試按鈕", this, Toast.LENGTH_SHORT).show(); 15 break; 16 } 17 }
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()方法獲取二維碼上的數據。