Android Studio Flavors详解
這兩天發現Android Studio?的Flavors用起來相當給力!這里跟大家分享下:
Flavors中文翻譯過來叫“口味”,不知道確切叫法是啥,它的功能就是允許你的APP有多個不同的版本,不同版本的代碼可以不一樣,如果多渠道打包(咦!這樣看到中文中渠道很貼切呀,哈哈),可以有baidu,360等等!
我今天這個Android Studio教程講這個不是多渠道打包,這塊交給專業打包的GG,我們這里講適合做項目開發的用法。
我們把項目分兩個flavors:
mock:模擬版,這里所有數據都用寫好的模擬數據來運行APP
當你要開發一個新功能,但是服務器代碼還沒有寫好的時候怎么辦?
傻等么,Of cause not!我們切換到mock版用模擬數據繼續往下搞。
prod:真實版,這里所有數據都用真實數據來運行APP
當服務器開發好了,要聯調了我們再切換到prod版來調。
光說沒用,無圖無真相:
選中項目,右鍵->Open Module Settings?打開Preject Structure
選中Flavors?點擊“+” Name?填mock?再點“+”添加一個prod點OK
然后看我們app的build.gradle加了以下內容
android?{
????...
????productFlavors {
????????prod {
????????}
????????mock?{
????????}
????}
}
到這一步,也沒看出什么不一樣的。注意看,下面變化開始了
選中app-src?右鍵New->Directory新建文件夾mock
接著選中剛剛建的mock文件夾,右鍵New->Directory新建文件夾java
同理新建prod.java文件夾,最后結果如下:
細心的你會發現mock下的java文件夾是藍色的,prod文件夾則不是,why?
那是因為當前默認編譯是在mock?這個Flavor
點擊左下角的Build Variants打開窗口,可以看到app module?當前的Build Variant是mockDebug
你可以試試把mockDebug改為prodDebug再回到Project窗口,這一次是prod下的java為藍色的了。
回來,選中mock下的java,右鍵?New->package新建一個和main中一模一樣的包,這里是cn.huangx.mvpsample3
同理,把Build Variant切換到prodDebug同樣新建一個一樣的包,最后結果如下:
選中所建包名右鍵New->Java Class新建一個ModelManager
然后切換到mock版同一位置也建一個一樣名字的ModelManager。
這里注意一點,在mock和prod建的文件必須是一樣的,而且要是main里不能有的。
因為mock版的所有文件是main+mock里的,prod版的所有文件是main+prod里的
最后畫風是這樣的:
切換到mock版(要習慣,這一篇經常要切來切去)新建model包,并在包下新建一個FakeUserModel類,這個就是我們的模擬數據類了
下面看FakeUserModel類內容:
public?class FakeUserModel implements IUserModel?{
?
????Handler handler =?new?Handler();
?
????/**
?????* 登錄
?????*
?????* @param username 用戶名
?????* @param password 密碼
?????* @param callback 回調
?????*/
????@Override
????public void login(final String username, final String password, final Callback callback)?{
????????handler.postDelayed(new?Runnable() {//延時200ms回調,模擬網絡請求
????????????@Override
????????????public void run()?{
????????????????if?("huangx".equals(username) &&?"123456".equals(password)) {
????????????????????callback.onSuccess();
????????????????}?else?{
????????????????????callback.onFailure("用戶名或密碼錯誤(mock)");
????????????????}
????????????}
????????},?2000);
????}
}
FakeUserModel實現了IUserModel接口,與main中的UserModel一模一樣,為了區分onFailure信息后面加上(mock)。
要明白這一點,FakeUserModel是假的,main中的UserModel才是調用真實數據,這個Demo里為了演示,main沒有用真實實現,記住就好!
然后是mock中ModelManager內容:
public?class?ModelManager?{
????public static IUserModel provideUserModel()?{
????????return?new?FakeUserModel();
????}
}
提供一個靜態方法provideUserModel產生一個FakeUserModel。
切換到prod版,這里的ModelManager是這樣的:
public?class?ModelManager?{
????public static IUserModel provideUserModel()?{
????????return?new?UserModel();
????}
}
這里的provideUserModel方法產生的就是真實的IUserModel實現
重頭戲來了,我們回到main的LoginActivity的onCreateLoader方法,把new UserModel()替換成ModelManager.provideUserModel()
public Loader<LoginPresenter> onCreateLoader(int id, Bundle args)?{
????????return?new?PresenterLoader(this,?new?PresenterFactory<LoginPresenter>() {
????????????@Override
????????????public LoginPresenter create()?{
????????????????return?new?LoginPresenter(ModelManager.provideUserModel());
????????????}
????????});
????}
搞定這一步后就是HAPPY的時候了:
切換到mock版LoginPresenter傳入的參數IUserModel就是真實環境的UserModel
切換到prod版LoginPresenter傳入的參數IUserModel就是模擬環境的FakeUserModel
服務器沒好我切mock自已搞,服務器好了我切prod跟你調,哈哈,媽媽再也不用擔我調接口了!
?
原文來自:簡書/仙鬼
總結
以上是生活随笔為你收集整理的Android Studio Flavors详解的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: dpdk中文-dpdk虚拟机出错
- 下一篇: rk3288 添加系统广播