最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

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

一、幾句話

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

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

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

項目結(jié)構(gòu)
有兩種流行的選擇:舊的Ant & Eclipse ADT項目結(jié)構(gòu);新的Gradle & Android Studio項目結(jié)構(gòu)。你應該選擇后者。如果你的項目使用舊的結(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),這是來自Gradle的理念。
使用最高級別"app"有利于將你的app和其他你的應用所引用的庫項目(如:library-foobar)做區(qū)分。然后settings.gradle保持應用對這些庫的索引,而app/build.gradle可以指向這些庫。

Gradle配置
通用架構(gòu)請遵循;
小任務(腳本),你可以使用Gradle來制作小任務而不是Shell、Python或Perl等,具體參考
;
密碼。在你應用的build.gradle中你需要為發(fā)布編譯定義 signingConfigs。具體如下:
不要像下面這樣寫,這樣會出現(xiàn)在你的版本控制系統(tǒng)里:

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

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

KEYSTORE_PASSWORD=password123
KEY_PASSWORD=password789

這個文件會被gradle自動導入,所以你可以在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可參考原文檔


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

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

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

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

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ī)范化一個布局XML文件,可參考下面慣例:

  • 每行一個屬性,縮進4個空格;
  • android:id永遠放在第一個;
  • android:layout_** 屬性要放在頂部;
  • style屬性放在尾部;
  • 結(jié)束標志位 />要獨占一行,有助于對屬性排序或添加;
  • 不要寫hard code,如 android:text,對于Android Studio來說可考慮使用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>

相關文章

  • Java中批處理框架spring batch詳細介紹

    Java中批處理框架spring batch詳細介紹

    這篇文章主要介紹了Java中批處理框架spring batch詳細介紹,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-07-07
  • 詳解java配置文件的路徑問題

    詳解java配置文件的路徑問題

    這篇文章主要介紹了詳解java配置文件的路徑問題的相關資料,這里對絕對路徑及相對路徑和classpath 類文件路徑進行詳細介紹,需要的朋友可以參考下
    2017-07-07
  • JavaWeb中的文件的上傳和下載

    JavaWeb中的文件的上傳和下載

    JavaWeb 文件的上傳和下載是指在Web應用中實現(xiàn)用戶上傳文件到服務器和從服務器下載文件的功能,通過JavaWeb技術,可以方便地實現(xiàn)文件的上傳和下載操作,提供更好的用戶體驗和數(shù)據(jù)交互,需要的朋友可以參考下
    2023-10-10
  • MyBatis攔截器動態(tài)替換表名的方法詳解

    MyBatis攔截器動態(tài)替換表名的方法詳解

    因為我們持久層框架更多地使用MyBatis,那我們就借助于MyBatis的攔截器來完成我們的功能,這篇文章主要給大家介紹了關于MyBatis攔截器動態(tài)替換表名的相關資料,需要的朋友可以參考下
    2022-04-04
  • Java中的泛型詳細解析

    Java中的泛型詳細解析

    這篇文章主要介紹了Java中的泛型詳細解析,泛型又稱參數(shù)化類型,是JDK5.0出現(xiàn)的新特性,解決了數(shù)據(jù)類型的安全型問題,Java泛型可以保證如果程序在編譯時沒用發(fā)出警告,運行時就不會產(chǎn)生classCastException異常,需要的朋友可以參考下
    2024-01-01
  • Java實現(xiàn)正則匹配 “1234567” 這個字符串出現(xiàn)四次或四次以上

    Java實現(xiàn)正則匹配 “1234567” 這個字符串出現(xiàn)四次或四次以上

    文章介紹了如何在Java中使用正則表達式匹配一個字符串四次或四次以上的出現(xiàn),首先創(chuàng)建正則表達式,然后使用Pattern和Matcher類進行匹配和計數(shù),通過示例代碼展示了如何實現(xiàn)這一功能,并解釋了匹配的整體次數(shù)和精確出現(xiàn)次數(shù)的邏輯,感興趣的朋友一起看看吧
    2025-02-02
  • Java GC 機制與內(nèi)存分配策略詳解

    Java GC 機制與內(nèi)存分配策略詳解

    這篇文章主要介紹了Java GC 機制與內(nèi)存分配策略詳解的相關資料,需要的朋友可以參考下
    2017-02-02
  • 解決logback的日志文件路徑問題

    解決logback的日志文件路徑問題

    這篇文章主要介紹了解決logback的日志文件路徑問題,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2021-02-02
  • java swing實現(xiàn)簡單計算器界面

    java swing實現(xiàn)簡單計算器界面

    這篇文章主要為大家詳細介紹了java swing實現(xiàn)簡單計算器界面,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2022-04-04
  • IDEA運行spring項目時,控制臺未出現(xiàn)的解決方案

    IDEA運行spring項目時,控制臺未出現(xiàn)的解決方案

    文章總結(jié)了在使用IDEA運行代碼時,控制臺未出現(xiàn)的問題和解決方案,問題可能是由于點擊圖標或重啟IDEA后控制臺仍未顯示,解決方案提供了解決方法,包括通過右三角Run運行(快捷鍵:Alt+42)或以Debug運行(快捷鍵:Alt+5)來解決
    2025-01-01

最新評論

吉安县| 白银市| 甘洛县| 南川市| 嘉峪关市| 静乐县| 台前县| 安顺市| 体育| 大庆市| 清苑县| 衡水市| 合水县| 桂林市| 吉安县| 海城市| 库车县| 紫阳县| 宝丰县| 丘北县| 宝丰县| 三河市| 贵阳市| 泰兴市| 碌曲县| 邹平县| 蓝田县| 泰宁县| 中山市| 泊头市| 汨罗市| 巴马| 兖州市| 分宜县| 安塞县| 广灵县| 巴青县| 绥德县| 康乐县| 忻州市| 大名县|