Android模塊化框架介紹

模塊化是一種成熟的業務解耦思想,目前已普遍應用在APP的開發中。以前寫過一篇文章——Android模塊化實踐對APP模塊化的過程及遇到的問題進行了介紹。具體的實例代碼最近也完善的差很少了,因此寫篇文章介紹一下這個項目——SimpleProject, 一個以分層思想+模塊化開發的通用框架,將會被長期維護。java

項目結構

本項目是按照Android模塊化實踐中介紹的結構來開展的,因此可先看下這篇文章瞭解一下基本結構。項目結構以下所示:git

image

其中,MainModule, BaseComponentDemo, BaseLibraryDemo和CommonBusinessDemo都是業務層模塊,他們的關係如圖所示:github

image

MainModule是整個APP的主模塊,用來實現APP中主頁和路由跳轉相關的邏輯,同時也做爲Application與其餘模塊關聯的樞紐。數據庫

BaseComponentDemo, BaseLibraryDemo和CommonBusinessDemo是子業務模塊,都依賴於library目錄中的三個公共模塊。這三個模塊一方面是用來展現業務模塊化實現過程,另外一方面也是library中三個模塊的示例代碼。因此這三個模塊中沒有什麼核心的代碼,下面主要介紹一下library中的三個模塊。api

建議

默認狀況下,建立的Module都是在Project目錄下,可是當模塊比較的多的時候,定位代碼時仍是比較繁瑣的,因此推薦將底層的Module放在建立的library目錄中,而後在setting.gradle中對Module的路徑進行配置:數組

project(':baselibrary').projectDir = new File('library/baselibrary')
project(':basecomponent').projectDir = new File('library/basecomponent')
project(':commonbusiness').projectDir = new File('library/commonbusiness')
複製代碼

有時候也會引入一些第三方的Module, 此時也可將其放在library目錄中,或者建立其餘的目錄用來存放第三方的Module,而後在setting.gradle中進行配置。這樣Project目錄下只有業務層的Module,項目結構看起來會清晰不少。緩存

baselibrary

baselibrary是Common組件層的實現,包括各類經常使用的工具類,通用的UI庫,數據源的封裝(包括網絡,文件,數據庫)。微信

工具類

commonutils中包含了豐富的工具類,具體介紹以下:網絡

AppUtil: App相關的一些操做,如版本號,進程號,是否已安裝,是否正在運行,是否運行在前臺等;

BitmapUtil: Bitmap相關的一些操做,如縮放,與Drawable之間的轉換等;

CollectionUtil: 與集合/數組相關的操做;

ConvertUtil: 基本類型與String之間的轉換操做;

DateTimeUtil: 時間格式化相關的操做;

DeviceUtil: 設備相關的操做,如獲取系統的各類參數;

EncryptUtil: 加密操做,如MD5, 隱藏手機號,郵箱等操做;

FileUtil: 與文件相關的操做;

InputMethodUtil: 與鍵盤相關的操做,如打開/隱藏鍵盤,鍵盤彈出時調整EditText位置等;

LaunchUtil: 跳轉到其餘APP的操做,如打開電話,短信等;

LogUtil: 日誌工具類;

NetworkUtil: 與網絡相關的工具類,如獲取網絡參數,獲取聯網狀態等;

PermissionUtil: 權限驗證類;

RomUtil: 判斷手機ROM的類型;

ScrollStateUtil: 判斷可滑動View是否到達頂部或底部;

SpannableStringUtil: 富文本工具類;

ToastUtil: Toast工具類

VerificationUtil: 驗證工具類,如手機號,郵箱,身份證,是否爲中文等;

ViewBgUtil: 動態設置View背景的工具類;

ShadowDrawable: 被View設置陰影的工具類;
複製代碼

數據源

Android中經常使用的數據源也就四個:SharePreference,文件,數據庫和網絡。app

SharePreference

SharePreference是Android提供的一種以key-value結構用來存儲少許數據的方式,本質上也是文件的存儲方式,可是直接使用時比較繁瑣,爲了簡化調用過程,項目中提供了它的封裝版——PreferencesManager,支持同步和異步兩種方式。

文件

文件方式就是簡單的文件讀寫,這裏的文件緩存使用了ACache

數據庫

與文件同樣,數據庫也算是Android中的低頻數據源,直接使用GreenDAO便可。

網絡

網絡是Android開發中主要的數據源,會被大量使用,因此須要進行簡單的封裝,從而簡化網絡請求的過程。網絡框架使用了Retrofit。 http目錄中是整個網絡框架的封裝,其中提供了公共參數,緩存,Cookie,認證四種攔截器。同時提供了Gson數據轉換的兼容類,避免異常數據轉換時因類型不匹配而致使的閃退。

網絡請求示例代碼:

HttpManager.getInstance().executeRequest(apiService.getUserInfo(), new ResponseProcessor.RequestListener<UserInfoBean>() {
	@Override
	public void onSuccess(UserInfoBean response) {
		// 請求成功
	}

	@Override
	public void onFailure(int code, String msg) {
		// 請求失敗
	}
});
複製代碼

通用UI

通用UI是一些自定義View,放在這個位置的自定義View須要有高度的可定製性和與業務無關的特徵。

CircleProgressBar: 圓形進度條;

LevelView: 相似Uber的等級選擇器;

RefreshLayout: 下拉刷新、上拉加載組件;

ResilienceListView: 下拉可回彈的ListView;

ShapeImageView: 可定義形狀的ImageView;

TabLayout: 相似微信底部的Tab組件;
複製代碼

basecomponent

basecomponent是基礎業務層的實現,用於統一APP的代碼結構和UI風格。主要包括Activity&Fragment,Dialog的封裝。

Activity & Fragment

Activity&Fragment做爲Android中承載View的組件,它們的風格基本決定了APP的總體風格。其實就目前主流的設計,Activity/Fragment的UI也就幾種狀態:

  • 頁面加載時是否有加載圈;
  • 頁面是否有NavigationBar;

總的來講也就這4種狀況的組合。針對這4種狀況提供瞭如下封裝類:

  • BaesActivity 不須要網絡請求的Activity;
  • BaesProgressActivity 須要網絡請求的Activity(頁面默認顯示加載圈);
  • BaseFragment 不須要網絡請求的Fragment;
  • BaseProgressFragment 須要網絡請求的Fragment(頁面默認顯示加載圈);

而對於NavigationBar也提供了三種樣式: 白底,透明,半透明,根據須要進行設置便可。

Dialog

Dialog也是Android開發中經常使用的UI組件,這裏提供了普通對話框,單選對話框,多選對話框,底部對話框四種方式,同時對每一種提供了自定義樣式和Material樣式兩種風格,具體可參考Android通用UI組件之Dialog

commonbusiness

commonbusiness是公共組件層的實現。其中包括APP中一些通用的功能,如登陸驗證,權限驗證,第三方登陸,分享,支付,推送等功能。

登陸驗證

在Android開發中,有一些頁面是須要登陸才能查看的,若是直接使用判斷登陸狀態的方式,就是顯得很繁瑣。所謂爲了簡化這種驗證過程,項目中提供了基於AOP的方式,開發者中須要驗證登陸狀態的方法上面使用@CheckLogin註解便可。具體代碼參考aspect目錄。

權限驗證

Android6.0以後權限的獲取都是經過動態獲取的,可是獲取的過程比較繁瑣,因此爲了簡化權限的獲取過程,這裏也使用了基於AOP的權限申請。在須要申請權限時,使用@CheckPermission註解便可,代碼以下所示:

@CheckPermission(permissions = {Manifest.permission.CAMERA,}, permissionDesc = "沒有權限沒法使用相機", settingDesc = "快去設置中開啓權限")
private void setUserIcon() {
	
}
複製代碼

當用戶拒絕了權限申請後,彈出toast提示permissionDesc中的內容,當勾選了【再也不詢問】拒絕後,再次申請就會彈出Dialog, 提示內容爲settingDesc,固然,這兩個字段也是有默認值的,若是不須要詳細的提示,可不用設置。

第三方登陸

如今的應用除了內置的登陸功能外,爲了便於用戶使用,一般還會提供第三方登陸的功能。一般使用的第三方登陸也就微信,微博,QQ三種。這裏爲第三方登陸提供了統一的接口,須要登陸時直接調用便可。

分享

目前APP的主要分享渠道是微信,微博和QQ,因此分享模塊也只集成了這三種分享方式。使用時只須要在相應的開發平臺上建立應用並配置參數,而後在分享模塊中配置參數便可。固然,項目中也提供了一個分享頁面——ShareActivity,分享時調用ShareActivity.enter(...)方法便可。

支付

項目中集成了微信支付和支付寶支付,而且爲支付提供了統一了接口,使用時只須要將從後臺獲取的參數傳入便可

支付寶支付
// requestStr是後臺返回的訂單相關的參數
PayManager.getInstance(PayActivity.this).payByAliPay(this, requestStr, new PayManager.AliPayListener() {
	@Override
	public void onSuccess() {
		ToastUtil.show("支付成功");
	}

	@Override
	public void onFailure(Exception e) {
		ToastUtil.show("支付失敗" + e.getMessage());
	}
});
複製代碼
微信支付
// 根據後臺返回的微信支付的參數構造PayRequestBean對象
PayRequestBean payRequest = new PayRequestBean(...)
PayManager.getInstance(PayActivity.this).payByWeChat(payRequest, new PayManager.AliPayListener() {
	@Override
	public void onSuccess() {
		ToastUtil.show("支付成功");
	}

	@Override
	public void onFailure(Exception e) {
		ToastUtil.show("支付失敗" + e.getMessage());
	}
});
複製代碼

推送

目前推送的推送率基本都是經過第三方推送SDK組合的方式來保障的,項目中集成了小米,華爲,極光推送三種方式,根據機型動態設置推送方式,小米手機使用小米推送,華爲推送使用華爲推送,其餘的品牌則使用極光推送。開發時只須要在Applicataion中調用PushManager的init方法進行初始化,而且設置推送的監聽便可。

PushManager.getInstance().initPush(getApplicationContext(), "小米推送的appId",
			"小米推送的appKey");

PushManager.getInstance().setPushListener(new PushListener() {
	@Override
	public void onReceiveMessage(Context context, int pushChannel, Object object) {
		/**
		 * 接收到自定義消息時的回調
		 */
	}

	@Override
	public void onReceiveNotification(Context context, int pushChannel, Object object) {
		/**
		 * 接收到通知時的回調
		 */
	}

	@Override
	public void onNotificationClicked(Context context, int pushChannel, Object object) {
		/**
		 * 點擊推送通知時的回調
		 */
	}
});
複製代碼

項目地址

SimpleProject

總結

目前的項目已經有個大概的輪廓了,可是細節方面還有許多須要完善的,同時實例代碼的展現也還不夠詳細,隨後會進一步完善,感興趣的小夥伴可關注一下。

相關文章
相關標籤/搜索