欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

淺談Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議

 更新時(shí)間:2016年03月10日 15:18:19   作者:iam_wingjay  
這篇文章主要介紹了Android開(kāi)發(fā)中項(xiàng)目的文件結(jié)構(gòu)及規(guī)范化部署建議,組織好代碼文件的結(jié)構(gòu)有利于維護(hù)團(tuán)隊(duì)合作的效率,需要的朋友可以參考下

一、幾句話

  • 使用Gradle及其推薦的項(xiàng)目框架
  • 把密碼等敏感數(shù)據(jù)放入gradle.properties
  • 不要自己寫Http客戶端,使用Volley或OkHttp庫(kù)
  • 使用Jackson庫(kù)來(lái)解析JSON數(shù)據(jù)
  • 避免Guava并出于Dalvik 65K methods limit不要使用過(guò)多的庫(kù)
  • 使用Fragment來(lái)繪制UI界面
  • Activity主要用來(lái)管理Fragment
  • 布局文件XML也是代碼,好好組織它們
  • 在布局文件里,使用styles以避免重復(fù)的屬性
  • 使用多個(gè)style文件而不是一個(gè)巨大的style文件
  • 保持你的 color.xml 短小而DRY,定義色盤
  • 同樣保持 dimens.xml DRY,定義通用常量
  • 不要?jiǎng)?chuàng)建一個(gè)太深層次的布局
  • 避免WebView的客戶端處理,而且要注意內(nèi)存泄露
  • 使用Robolectric來(lái)進(jìn)行單元測(cè)試,Robotium來(lái)進(jìn)行連接(UI)測(cè)試
  • 仿真器用Genymotion
  • 一定要用ProGuard 或 DexGuard

二、詳細(xì)
Android SDK
把你的Android SDK放置在你的主目錄里或其他與應(yīng)用無(wú)關(guān)的地方。一些IDEs在安裝的時(shí)候會(huì)把SDK關(guān)聯(lián)上,并把SDK放在IDE的同一個(gè)目錄下。當(dāng)你需要升級(jí)(重裝)IDE或者更換IDE時(shí)你就會(huì)發(fā)現(xiàn)糟糕之處啦。另外,如果你的IDE在一個(gè)user賬戶下而不是在root下運(yùn)行的話,就不要把SDK放在系統(tǒng)級(jí)目錄下,否則在使用時(shí)需要 sudo 權(quán)限,

Build System
默認(rèn)的選擇是 Gradle。Ant限制比較多而且太大。使用Gradle,你可以很輕易的做到:
-編譯不同的flavours 或應(yīng)用的 variants
-創(chuàng)建簡(jiǎn)單的 類-腳本 任務(wù)
-管理和下載依賴
-自定義keystores
-等等
Android的Gradle插件同樣被Google指定為新的標(biāo)準(zhǔn)編譯系統(tǒng),而且Google不斷為其升級(jí)。

項(xiàng)目結(jié)構(gòu)
有兩種流行的選擇:舊的Ant & Eclipse ADT項(xiàng)目結(jié)構(gòu);新的Gradle & Android Studio項(xiàng)目結(jié)構(gòu)。你應(yīng)該選擇后者。如果你的項(xiàng)目使用舊的結(jié)構(gòu),那么換掉吧。
舊結(jié)構(gòu)

old-structure 
├─ assets
├─ libs
├─ res
├─ src
│ └─ com/futurice/project
├─ AndroidManifest.xml
├─ build.gradle
├─ project.properties
└─ proguard-rules.pro

新結(jié)構(gòu)

new-structure
├─ library-foobar
├─ app
│ ├─ libs
│ ├─ src
│ │ ├─ androidTest
│ │ │ └─ java
│ │ │ └─ com/futurice/project
│ │ └─ main
│ │ ├─ java
│ │ │ └─ com/futurice/project
│ │ ├─ res
│ │ └─ AndroidManifest.xml
│ ├─ build.gradle
│ └─ proguard-rules.pro
├─ build.gradle
└─ settings.gradle

新結(jié)構(gòu)主要的不同在于拆分了'源代碼集' (main,androidTest),這是來(lái)自Gradle的理念。
使用最高級(jí)別"app"有利于將你的app和其他你的應(yīng)用所引用的庫(kù)項(xiàng)目(如:library-foobar)做區(qū)分。然后settings.gradle保持應(yīng)用對(duì)這些庫(kù)的索引,而app/build.gradle可以指向這些庫(kù)。

Gradle配置
通用架構(gòu)請(qǐng)遵循;
小任務(wù)(腳本),你可以使用Gradle來(lái)制作小任務(wù)而不是Shell、Python或Perl等,具體參考

密碼。在你應(yīng)用的build.gradle中你需要為發(fā)布編譯定義 signingConfigs。具體如下:
不要像下面這樣寫,這樣會(huì)出現(xiàn)在你的版本控制系統(tǒng)里:

signingConfigs { 
  release {  
   storeFile file("myapp.keystore")  
   storePassword"password123"
   keyAlias"thekey"
   keyPassword"password789"
  }
}

相反,你應(yīng)該創(chuàng)建一個(gè)不會(huì)被添加到版本控制系統(tǒng)里的gradle.properties文件

KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789

這個(gè)文件會(huì)被gradle自動(dòng)導(dǎo)入,所以你可以在build.gradle這樣使用:

signingConfigs { 
  release {
  try{
    storeFile file("myapp.keystore")  
    storePasswordKEYSTORE_PASSWORD  
    keyAlias"thekey"
    keyPasswordKEY_PASSWORD
 } catch(ex) {
  thrownewInvalidUserDataException("You should define KEYSTORE_PASSWORD and KEY_PASSWORD in gradle.properties.")  
  }
 }}

(如果使用Maven可參考原文檔

庫(kù)
Jackson是一個(gè)Java庫(kù),它可以實(shí)現(xiàn)對(duì)象和JSON數(shù)據(jù)的相互轉(zhuǎn)換。Gson 也是一個(gè)類似的不錯(cuò)選擇。不過(guò)我們覺(jué)得Jsckson更好因?yàn)樗С侄喾N方式來(lái)處理JSON:流式,內(nèi)存樹(shù)模型和傳動(dòng)的JSON-POJO數(shù)據(jù)綁定。但是,記住,Jackson比GSON更加龐大,所以你要酌情考慮,如果你想避免 65k methods limit那最好用GSON。其他選擇:Json-smart Boon JSON
網(wǎng)絡(luò)、緩存和圖片。使用Volley 或者Retrofit。Volley也可以用來(lái)加載和緩存圖片。如果你選擇Retrofit,你可以用Picasso 來(lái)加載和緩存圖片。然后使用 OkHttp 來(lái)執(zhí)行有效的HTTP請(qǐng)求。這三種:Retrofit、Picasso和OkHttp都來(lái)源于同一樣公司,所以它們互相補(bǔ)充。OkHttp 能用來(lái)與 Volley 相連接。
RxJava是一個(gè)響應(yīng)式編程庫(kù),換句話說(shuō),處理異步事件。(具體可參考原文檔
Retrolambda 是一個(gè)Java庫(kù),它幫助你的Android或者其他早于JDK8平臺(tái)上使用Lambda表達(dá)式。(具體可參考原文檔
最后,記住dex方法限制,不要使用太多庫(kù)。(Android應(yīng)用,當(dāng)被打包成dex文件時(shí),有一個(gè)最大限制:65535個(gè)引用方法[1][2][3]。如果你超過(guò)了限制就會(huì)發(fā)生嚴(yán)重錯(cuò)誤。因此,不要使用剛過(guò)多庫(kù),使用 dex-method-counts 工具來(lái)決定使用哪些類從而保持在限制內(nèi),尤其要避免使用Guava庫(kù),因?yàn)樗^(guò)13k方法)
Activities和Fragments
Fragments應(yīng)該是你在Android部署UI界面的默認(rèn)選項(xiàng)。Fragments可以在你的應(yīng)用里重用。我們推薦使用Fragements而不是 activities 來(lái)繪制界面基于以下幾點(diǎn):

  • 解決是多視圖布局。Fragments被引入進(jìn)來(lái)的主要原因是把手機(jī)應(yīng)用程序拓展到平臺(tái)電腦上,這樣的話你在平板上可以同時(shí)顯示A和B視圖,而在手機(jī)上可只顯示A或B。如果你的程序最開(kāi)始就是使用Fragment來(lái)實(shí)現(xiàn),那么你的程序可以更容易適用于多種設(shè)備。
  • 屏到屏的通信。Android的API并不提供一個(gè)合適的方式來(lái)實(shí)現(xiàn)Activity之間傳遞復(fù)雜數(shù)據(jù)(如Java對(duì)象)。但是,使用Fragment,你可以利用Activity來(lái)成為其子Fragment之間通信的通道。即使這比Activity-到-Activity通信要好不少,我仍然建議你采取Event Bus架構(gòu),例如使用Otto 或者 greenrobot EventBus來(lái)作為一個(gè)更簡(jiǎn)潔的方案。如果你不想采取附加的庫(kù),那么RxJava也可以被用來(lái)實(shí)現(xiàn)一個(gè)EventBus。
  • Fragment不僅僅可以用來(lái)布局UI。你可以添加一個(gè) 沒(méi)有UI界面的Fragment 作為Activity的后臺(tái)服務(wù)者。甚至你可以創(chuàng)建一個(gè)Fragment來(lái)實(shí)現(xiàn)Fragment切換邏輯,而不是讓Activity去處理Fragment切換邏輯。
  • Fragment里甚至可以管理ActionBar。你可以選擇一個(gè)沒(méi)有UI界面的Fragment來(lái)專門管理ActionBar,或者你可以選擇每個(gè)當(dāng)前可視的Fragment自己來(lái)處理父Activity的ActionBar。參考這里。
  • 然后,我們也不建議過(guò)度使用嵌套Fragments,那可能導(dǎo)致matryoshka 漏洞。
  • 從架構(gòu)的角度來(lái)考慮,你的應(yīng)用應(yīng)該有一個(gè)頂級(jí)Activity,它會(huì)包含大部分業(yè)務(wù)相關(guān)的fragments。你也可以創(chuàng)建一些其他的支持性Activities,只要它們與主Activity的通信保持簡(jiǎn)單--形似與 Intent.setData()或Intent.setAction()。

Java包結(jié)構(gòu)

在Android應(yīng)用程序里的Java結(jié)構(gòu)接近MVC結(jié)構(gòu)(Model-View-Controller)。在Android里,F(xiàn)ragment和Activity實(shí)際上都是控制器類。而從另一角度來(lái)看,他們又是用戶交互的一部分,也就是說(shuō)屬于視圖View類。
因此,我們很難嚴(yán)格區(qū)分Fragment(或Activity)是控制器還是視圖。所以從Java包角度來(lái)看,我們最好把Fragment放在它們自己的fragments包里,然后Activity放在最高級(jí)的包里面(遵循上文提出的建議)。當(dāng)然,如果你想有2個(gè)或以上的Activity,那你就創(chuàng)建一個(gè)activitys包。
這樣的話,整個(gè)結(jié)構(gòu)看起來(lái)就是一個(gè)典型的MVC結(jié)構(gòu)。一個(gè)Models包包含POJOs,用來(lái)轉(zhuǎn)化API接口獲取的Json數(shù)據(jù),一個(gè)views包包含Views,notifications,action bar views,widgets等。Adapters是一個(gè)中間層,位于數(shù)據(jù)和視圖之間。但是,它們通常需要通過(guò)getView()來(lái)輸出View視圖,所以你可以把a(bǔ)dapters放在views包的子包位置。
一些應(yīng)用程序級(jí)別、僅屬于Android系統(tǒng)的控制器類,應(yīng)該放在managers包里。各種各樣的數(shù)據(jù)處理類,例如DateUtils可以放在utils包里。與后臺(tái)服務(wù)器交互的類應(yīng)該放在network包里。
總之,從與服務(wù)器交互到與用戶交互的整體架構(gòu)可設(shè)計(jì)如下:

com.futurice.project
├─ network
├─ models
├─ managers
├─ utils
├─ fragments
├─ views
  ├─ adapters
  ├─ actionbar
  ├─ widgets
  ├─ notifications

資源文件
命名
遵循加前綴的慣例,類似type_foo_bar.xml,如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml。

組織布局文件
如果你不知道如何規(guī)范化一個(gè)布局XML文件,可參考下面慣例:

  • 每行一個(gè)屬性,縮進(jìn)4個(gè)空格;
  • android:id永遠(yuǎn)放在第一個(gè);
  • android:layout_** 屬性要放在頂部;
  • style屬性放在尾部;
  • 結(jié)束標(biāo)志位 />要獨(dú)占一行,有助于對(duì)屬性排序或添加;
  • 不要寫hard code,如 android:text,對(duì)于Android Studio來(lái)說(shuō)可考慮使用Designtime attributes方法。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout
 xmlns:android="http://schemas.android.com/apk/res/android"
 xmlns:tools="http://schemas.android.com/tools"
 android:layout_width="match_parent"
 android:layout_height="match_parent"
 android:orientation="vertical"
>

  <TextView
   android:id="@+id/name"
   android:layout_width="match_parent"
   android:layout_height="wrap_content"
   android:layout_alignParentRight="true"
   android:text="@string/name"
   style="@style/FancyText"
  />

  <include layout="@layout/reusable_part" />

</LinearLayout>

相關(guān)文章

  • SpringBoot集成drools的實(shí)現(xiàn)示例

    SpringBoot集成drools的實(shí)現(xiàn)示例

    本文主要介紹了SpringBoot集成drools的實(shí)現(xiàn)示例,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2022-05-05
  • Spark SQL 編程初級(jí)實(shí)踐詳解

    Spark SQL 編程初級(jí)實(shí)踐詳解

    這篇文章主要為大家介紹了Spark SQL 編程初級(jí)實(shí)踐詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用(推薦)

    Jrebel License Server 激活 IDEA-Jrebel-在線-

    這篇文章主要介紹了Jrebel License Server 激活 IDEA-Jrebel-在線-離線-均適用,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2020-12-12
  • maven項(xiàng)目引用外部jar包的方法

    maven項(xiàng)目引用外部jar包的方法

    本篇文章主要介紹了maven項(xiàng)目引用外部jar的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • mac 安裝java1.8的過(guò)程詳解

    mac 安裝java1.8的過(guò)程詳解

    這篇文章主要介紹了mac 安裝java1.8,包括下載過(guò)程及配置環(huán)境相關(guān)知識(shí)介紹,本文結(jié)合實(shí)例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-09-09
  • java 生成xml并轉(zhuǎn)為字符串的方法

    java 生成xml并轉(zhuǎn)為字符串的方法

    今天小編就為大家分享一篇java 生成xml并轉(zhuǎn)為字符串的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧
    2018-07-07
  • Java線程協(xié)作的兩種方式小結(jié)

    Java線程協(xié)作的兩種方式小結(jié)

    Java中線程協(xié)作的最常見(jiàn)的兩種方式是利用Object.wait()、Object.notify()和使用Condition,本文主要介紹了Java線程協(xié)作的兩種方式小結(jié),文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2023-05-05
  • Mybatis中mapper.xml實(shí)現(xiàn)熱加載介紹

    Mybatis中mapper.xml實(shí)現(xiàn)熱加載介紹

    大家好,本篇文章主要講的是Mybatis中mapper.xml實(shí)現(xiàn)熱加載介紹,感興趣的同學(xué)趕快來(lái)看一看吧,對(duì)你有幫助的話記得收藏一下
    2022-01-01
  • Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式

    Struts2學(xué)習(xí)筆記(3)-DMI動(dòng)態(tài)調(diào)用方式

    本文主要介紹Struts2的DMI動(dòng)態(tài)調(diào)用的兩種方式,簡(jiǎn)單實(shí)用,希望能給大家做一個(gè)參考。
    2016-06-06
  • 淺談java中為什么重寫equals后需要重寫hashCode

    淺談java中為什么重寫equals后需要重寫hashCode

    今天帶各位學(xué)習(xí)一下java中為什么重寫equals后需要重寫hashCode,文中有非常詳細(xì)的圖文介紹及代碼示例,對(duì)正在學(xué)習(xí)java的小伙伴們有很好的幫助,需要的朋友可以參考下
    2021-05-05

最新評(píng)論