Android開發(fā)技術(shù)文檔_第1頁(yè)
Android開發(fā)技術(shù)文檔_第2頁(yè)
Android開發(fā)技術(shù)文檔_第3頁(yè)
Android開發(fā)技術(shù)文檔_第4頁(yè)
Android開發(fā)技術(shù)文檔_第5頁(yè)
已閱讀5頁(yè),還剩13頁(yè)未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡(jiǎn)介

1、An droid開發(fā)最佳實(shí)踐從FUturiCe公司Android開發(fā)者中學(xué)到的經(jīng)驗(yàn)。遵循以下準(zhǔn)則,避免重復(fù)發(fā)明輪子。若您對(duì)開發(fā)iOS或 Windows PhOne 有興趣,請(qǐng)看iOS Good PraCtiCeS 和 Windows client Good PraCtiCeS 這兩篇文章。摘要?使用GradIe和它推薦的工程結(jié)構(gòu)? 把密碼和敏感數(shù)據(jù)放在perties? 不要自己寫HTTP客戶端,使用Volley或OkHttP庫(kù)? 使用JaCkSOn庫(kù)解析JSON數(shù)據(jù)? 避免使用GUaVa同時(shí)使用一些類庫(kù)來避免 65k method limit (一個(gè)Android程序中最多

2、能執(zhí)行65536個(gè)方法)? 使用Fragments來呈現(xiàn)Ul視圖? 使用ACtiVitieS只是為了管理Fragments? LayOUt布局是XMLS代碼,組織好它們? 在layoutout XMLS布局時(shí),使用StyIeS文件來避免使用重復(fù)的屬性?使用多個(gè)style文件來避免單一的一個(gè)大style文件?保持你的colors.xml簡(jiǎn)短DRY(不要重復(fù)自己),只是定義調(diào)色板?總是使用dimens.xml DRY(不要重復(fù)自己),定義通用常數(shù)? 不要做一個(gè)深層次的VieWGrOUP?在使用WebVieWS時(shí)避免在客戶端做處理,當(dāng)心內(nèi)存泄露? 使用Robolectric單元測(cè)試,Robotium

3、 做UI測(cè)試?使用Genymotion作為你的模擬器? 總是使用PrOGUard和DeXGUard混淆來項(xiàng)目An droid SDK將你的Android SDK放在你的home目錄或其他應(yīng)用程序無關(guān)的位置。當(dāng)安裝有些包含SDK的IDE的時(shí)候,可能會(huì)將SDK放在IDE同一目錄下,當(dāng)你需要 升級(jí)(或重新安裝)IDE或更換的IDE時(shí),會(huì)非常麻煩。此外,若果你的IDE 是在普通用戶,不是在root下運(yùn)行,還要避免吧SDK放到一下需要sudo權(quán)限 的系統(tǒng)級(jí)別目錄下。構(gòu)建系統(tǒng)你的默認(rèn)編譯環(huán)境應(yīng)該是 Gradle. Ant有很多限制,也很冗余。使用 Gradle, 完成以下工作很方便:?構(gòu)建APP不同版本的

4、變種?制作簡(jiǎn)單類似腳本的任務(wù)?管理和下載依賴?自定義秘鑰? 更多同時(shí),Android GradIe插件作為新標(biāo)準(zhǔn)的構(gòu)建系統(tǒng)正在被Google積極的開發(fā)。工程結(jié)構(gòu)有兩種流行的結(jié)構(gòu):老的 Ant & ECIiPSe ADT工程結(jié)構(gòu),和新的 GradIe &Android StUdiO工程結(jié)構(gòu),你應(yīng)該選擇新的工程結(jié)構(gòu),如果你的工程還在使用 老的結(jié)構(gòu),考慮放棄吧,將工程移植到新的結(jié)構(gòu)。老的結(jié)構(gòu):old-structureI assetsI libsI resI SrCI1 com/futurice/PrOjeCtIn droidMa ni fest.xmlI build.gradleI

5、 PrOjeCperties1 PrOgUard -新的結(jié)構(gòu)new-structureI Iibrary -foobarIappIIlibsIISrCIIIan droidTestII1 com/futurice/PrOjeCtI1mai nIIjavaI I1 com/futurice/PrOjeCtIIresI1An droidMa ni fest.xmlI build.gradle1 PrOgUarCirUI build.gradle Sett in gs.gradle主要的區(qū)別在于,新的結(jié)構(gòu)明確的分開了'source sets'

6、( main ,androidTest ),GradIe的一個(gè)理念。 你可以做到,例如,添加源組 Pa和 fre在SrC中,這將成為您的應(yīng)用程序的付費(fèi)和免費(fèi)的兩種模式的源代碼。你的項(xiàng)目引用第三方項(xiàng)目庫(kù)時(shí)(例如,Iibrary-foobar ),擁有一個(gè)頂級(jí)包名app 從第三方庫(kù)項(xiàng)目區(qū)分你的應(yīng)用程序是非常有用的。然后Settings.gradle 不斷引用這些庫(kù)項(xiàng)目,其中app/build.gradle 可以引用。GradIe配置常用結(jié)構(gòu) 參考 Google's guide On GradIe for Android小任務(wù)除了 (shell, PythOn, Perl, etc)這些腳本

7、語(yǔ)言,你也可以使用GradIe制作任務(wù)。更多信息請(qǐng)參考Gradle's documentation 。密碼在做版本release時(shí)你app的build.gradle 你需要定義SigningConfigs.此時(shí)你應(yīng)該避免以下內(nèi)容:不要做這個(gè).這會(huì)出現(xiàn)在版本控制中。"myapp.keystore" )Sig ningCon figs release store(StOrePaSSWOrd keyAIias keyPassword"password123""thekey""password789"而是,建立一個(gè)

8、不加入版本控制系統(tǒng)的perties 文件。KEYSTORE_PASSWORD=PaSSWord123KEY_PASSWORD=PaSSWOrd789那個(gè)文件是gradle自動(dòng)引入的,你可以在buld.gradle 文件中使用,例如:Sig ningCon figs release try store(StOrePaSSWOrd keyAIias keyPasswordCatCh (ex) throw"myapp.keystore" )KEYSTORE_PASSWORD"thekey"KEY_PASSWORDnew InVaIidUSe

9、rDataEXCePtiOn("You should defineKEYSTORE_PASSWORD and KEY_PASSWORD in perties.")使用MaVen依賴方案代替使用導(dǎo)入jar包方案 如果在你的項(xiàng)目中你明確使用 率jar文件,那么它們可能成為永久的版本,如2.1.1 .下載jar包更新他們是很繁瑣的,這個(gè)問題MaVen很好的解決了,這在 Android GradIe構(gòu)建中也是推 薦的方法。你可 以指定版本的一個(gè)范圍,如2.1.+ ,然后MaVen會(huì)自動(dòng)升級(jí)到制 定的最新版本,例如:depe nden CieS compile&#

10、39;com. netflix.rxjava:rxjava-core:0.19.+'compile'com. netflix.rxjava:rxjava-a ndroid:0.19.+'compile'com.fasterxml.jacks on .core:jacks on-databi nd:2.4.+'compile'com.fasterxml.jacks on .core:jacks on-COre:2.4.+'compile'com.fasterxml.jacks on .core:jacks on-ann otatio

11、 ns:2.4.+'compile'com.squareup.okhttp:OkhttP:2.0.+'compile'com.squareup.okhttp:OkhttP-UrIC onn ecti on: 2.0.+'IDES and text editorsIDE集成開發(fā)環(huán)境和文本編輯器無論使用什么編輯器,一定要構(gòu)建一個(gè)良好的工程結(jié)構(gòu)編輯器每個(gè)人都有自己的選擇,讓你的編輯器根據(jù)工程結(jié)構(gòu)和構(gòu)建系統(tǒng)運(yùn)作,那是你自己的責(zé)任。當(dāng)下首推Android Studio ,因?yàn)樗怯晒雀栝_發(fā),最接近 GradIe ,默認(rèn)使用最新 的工程結(jié)構(gòu),已經(jīng)到beta階段(目前

12、已經(jīng)有release 1.0 了),它就是為Android開發(fā)定制的。你也可以使用ECIiPSe ADT ,但是你需要對(duì)它進(jìn)行配置,因?yàn)樗褂昧伺f的工 程結(jié)構(gòu) 和Ant作為構(gòu)建系統(tǒng)。你甚至可以使用純文版編輯器如Vim, SUbIimeTeXt ,或者EmaCS。如果那樣的話,你需要使用GardIe和adb命令行。如果使用ECIiPSe集成GradIe不適合你,你只是使用命令行構(gòu)建工程,或遷移到Android StUdiO 中來吧。無論你使用何種開發(fā)工具,只要確保GradIe和新的項(xiàng)目結(jié)構(gòu)保持官方的方式構(gòu)建應(yīng)用程序,避免你的編輯器配置文件加入到版本控制。例如,避免加入Ant build.xml

13、文件。特別如果你改變Ant的配置,不要忘記保持build.gradle 是最新和起作用的。同時(shí),善待其他開發(fā)者,不要強(qiáng)制改變他們的開發(fā)工具和 偏好。類庫(kù)JaCkSOn是一個(gè)將java對(duì)象轉(zhuǎn)換成JSON與JSON轉(zhuǎn)化java類的類庫(kù)。Gson是解決這個(gè)問題的流行方案,然而我們發(fā)現(xiàn)JaCkSon更高效,因?yàn)樗С痔娲姆椒ㄌ幚鞪SON:流、內(nèi)存樹模型,和傳統(tǒng)JSoN-PoJo數(shù)據(jù)綁定。不過, 請(qǐng)記住,JSonkson庫(kù)比起GSoN更大,所以根據(jù)你的情況選擇,你可能選擇GSoN來避免APP 65k個(gè)方法限制。其它選擇:JSOn-Smart and Boon JSON網(wǎng)絡(luò)請(qǐng)求,緩存,圖片 執(zhí)行請(qǐng)求后端

14、服務(wù)器,有幾種交互的解決方案,你應(yīng)該 考慮實(shí)現(xiàn)你自己的網(wǎng)絡(luò)客戶端。使用VOlley或Retrofit。Volley同時(shí)提供圖片緩存類。若果你選擇使用 Retrofit,那么考慮使用PiCaSSO來加載圖片和緩存, 同時(shí)使用OkHttP作為高效的網(wǎng)絡(luò)請(qǐng)求。RetrOfit,PiCaSSO和OkHttP都是有同 一家公司開發(fā)(注: 是由SqUare公司開發(fā)),所以它們能很好的在一起運(yùn)行。 OkHttP同樣可以和VOiley在一起使用Volley.RXJaVa是函數(shù)式反應(yīng)性的一個(gè)類庫(kù),換句話說,能處理異步的事件。這是一個(gè)強(qiáng)大的和有前途的模式,同時(shí)也可能會(huì)造成混淆,因?yàn)樗侨绱说牟煌?。我們建議在使用這

15、個(gè)庫(kù)架構(gòu)整個(gè)應(yīng)用程序之前要謹(jǐn)慎考慮。有一些項(xiàng)目是使用RXJaVa完成的,如果你需要幫助可以跟這些人取得聯(lián)系:Timo Tuominen,Olli Saionen, Andre Medeiros, Mark Voit, Antti Lammi, Vera IZrailit, JUha RiStolainen.我們也寫了一些博客:1, 2, 3, 4.如若你之前有使用過RX的經(jīng)歷,開始從API響應(yīng)應(yīng)用它。另外,從簡(jiǎn)單的Ul 事件處理開始運(yùn)用,如單擊事件或在搜索欄輸入事件。若對(duì)你的RX技術(shù)有信心,同時(shí)想要將它應(yīng)用到你的整體架構(gòu)中,那么請(qǐng)?jiān)趶?fù)雜的部分寫好JaVadOCS文檔。請(qǐng)記住其他不熟悉RXJaV

16、a的開發(fā)人員,可能會(huì)非常難理解整個(gè)項(xiàng)目。 盡你的的全力幫助他們理解你的代碼和RX。RetrOiambda 是一個(gè)在Android和預(yù)JDK8平臺(tái)上的使用Lambda表達(dá)式語(yǔ)法 的JaVa類庫(kù)。它有助于保持你代碼的緊湊性和可讀性,特別當(dāng)你使用如RXJaVa函數(shù)風(fēng)格編程時(shí)。使用它時(shí)先安裝JDK8 ,在Android StUdiO工程結(jié)構(gòu)對(duì)話框中把它設(shè)置成為SDK路徑,同時(shí)設(shè)置JAVA8_HOME和JAVA7_HOME環(huán)境變 量,然后在工程根目錄下配置 build.gradle :depe nden CieS CiaSSPath'me.tatarka:gradle-retrolambda:2

17、4+'同時(shí)在每個(gè) module的build.gradle中添加apply PiUgin : 'retrolambda'an droid COmPiieOPti ons SOUrCeCOmPatibiiityJaVaVerSiO n.VERSION_1_8targetcompatibilityJaVaVerSiO n.VERSION_1_8 jdk System. getenv( "JAVA8_H0ME")OIdJdk System. getenv( "JAVA7_HOME")javaVersionJaVaVerSiO n.VERS

18、IoN_1_7 Android StUdiO 提供Java8 IambdaS表帶是代碼提示支持。如果你對(duì)IambdaS不熟悉,只需參照以下開始學(xué)習(xí)吧:? 任何只包含一個(gè)接口的方法都是"lambda friendly"同時(shí)代碼可以被折疊成 更緊湊的語(yǔ)法?如果對(duì)參數(shù)或類似有疑問,就寫一個(gè)普通的匿名內(nèi)部類,然后讓Android StatUS 為你生成一個(gè) Iambda。當(dāng)心dex方法數(shù)限制,同時(shí)避免使用過多的類庫(kù)Android apps ,當(dāng)打包成一個(gè)dex文件時(shí),有一個(gè)65535個(gè)應(yīng)用方法強(qiáng)硬限制1 2 3。當(dāng)你突破65k限制 之后你會(huì)看到一個(gè)致命錯(cuò)誤。因此,使用一個(gè)正常范圍的

19、類庫(kù)文件,同時(shí)使用 dex-method-counts工具來決定哪些類庫(kù)可以再65k限制之下使用,特別的避 免使用GUaVa類庫(kù),因?yàn)樗^13k個(gè)方法。ACtiVitieS and Fragme ntsFragments應(yīng)該作為你實(shí)現(xiàn)UI界面默認(rèn)選擇。你可以重復(fù)使用 Fragments用 戶接口來組合成你的應(yīng)用。我們強(qiáng)烈推薦使用 Fragments而不是activity來呈 現(xiàn)UI界面,理由如下:?提供多窗格布局解決方案Fragments的引入主要將手機(jī)應(yīng)用延伸到平板 電腦,所以在平板電腦上你可能有 A、B兩個(gè)窗格,但是在手機(jī)應(yīng)用上A、B可能分別充滿整個(gè)屏幕。如果你的應(yīng)用在最初就使用了f

20、ragments,那么以后將你的應(yīng)用適配到其他不同尺寸屏幕就會(huì)非常簡(jiǎn)單。?屏幕間數(shù)據(jù)通信 從一個(gè)ACtiVity發(fā)送復(fù)雜數(shù)據(jù)(例如JaVa對(duì)象)到另外一個(gè)ACtiVity,Android的API并沒有提供合適的方法。不過使用Fragment ,你可以使用一個(gè) activity 實(shí)例作為這個(gè) activity 子fragments的通信通道。即使這樣比 ACtiVity與ACtiVity間的通信好,你也想考慮使用EVent BUS架構(gòu),使用如 OttO或者greenrobot EVentBus 作為更簡(jiǎn)潔的實(shí)現(xiàn)。如果你希望避免添加另外一個(gè)類庫(kù),RXJaVa同樣可以實(shí)現(xiàn)一 個(gè) EVent BUS。

21、? Fragments 般通用的不只有UI你可以有一個(gè)沒有界面的fragment作為ACtiVity提供后臺(tái)工作。進(jìn)一步你可以使用這個(gè)特性來創(chuàng)建一個(gè)fragment包含改變其它fragment的邏輯而不是把這個(gè)邏輯放在 activity 中。? 甚至ActionBar都可以使用內(nèi)部fragment來管理你可以選擇使用一個(gè) 沒有Ul界面的fragment來專門管理ActionBar,或者你可以選擇使用在 每個(gè)Fragment中添加它自己的action來作為父ACtiVity的ActionBar.很不幸,我們不建議廣泛的使用嵌套的fragments ,因?yàn)橛袝r(shí)會(huì)引起matryoshka bugs。

22、我們只有當(dāng)它有意義(例如,在水平滑動(dòng)的 VieWPager在像 屏幕一樣fragment中)或者他的確是一個(gè)明智的選擇的時(shí)候才廣泛的使用 fragment。在一個(gè)架構(gòu)級(jí)別,你的APP應(yīng)該有一個(gè)頂級(jí)的activity來包含絕大部分業(yè)務(wù)相 關(guān)的fragment。你也可能還有一些輔助的 activity ,這些輔助的activity與主 activity通信很簡(jiǎn)單限制在這兩種方法Intent.setData()或Intent.setAction()或類似的方法。JaVa包結(jié)構(gòu)Android應(yīng)用程序在架構(gòu)上大致是 JaVa中的MOdeI-VieW-COntroller結(jié)構(gòu)。在 Android中Frag

23、ment和ACtiVity通常上是控制器類().換句話說,他們是用戶接 口的部分,同樣也是VieWS視圖的部分。正是因?yàn)槿绱耍藕茈y嚴(yán)格的將 fragments (或者activities)嚴(yán)格的劃分成 控制 器COntrolloers還是視圖VieWS。 最還是將它們放在自己?jiǎn)为?dú)的 fragments 包中。 只要你遵循之前提到的建議,ACtiVitieS則可以放在頂級(jí)目錄下。若果你規(guī)劃有2到3個(gè)以上的activity ,那么還是同樣新建一個(gè)activities 包吧。然而,這種架構(gòu)可以看做是另一種形式的MVC,包含要被解析API響應(yīng)的JSoN數(shù)據(jù),來填充的POJO的models包中。和一個(gè)

24、VieWS包來包含你的自定 義視圖、通知、導(dǎo)航視圖,WidgetS等等。適配器AdaPter是在數(shù)據(jù)和視圖之 間。然而他們通常需要通過getView()方法來導(dǎo)出一些視圖,所以你可以將adapters 包放在VieWS 包里面。一些控制器角色的類是應(yīng)用程序級(jí)別的,同時(shí)是接近系統(tǒng)的。這些類放在managers包下面。一些繁雜的數(shù)據(jù)處理類,比如說"DateUtiIs",放在utils 包下 面。與后端交互負(fù)責(zé)網(wǎng)絡(luò)處理類,放在 n etwork包下面??偠灾宰罱咏脩舳皇亲罱咏蠖巳グ才潘麄?。n etwork models man agers utils fragme n

25、ts VieWSadapters action barWidgetS no tificati ons資源文件Resources?命名遵循前綴表明類型的習(xí)慣,形如type_foo_bar.xml。例如:fragme nt_con tact_details.xml,view_Primary_butt on .xml, activity_ma in .xml .組織布局文件若果你不確定如何排版一個(gè)布局文件,遵循一下規(guī)則可能會(huì)有幫 助。?每一個(gè)屬性一行,縮進(jìn)4個(gè)空格? an droid:id總是作為第一個(gè)屬性? an droid:layout_*屬性在上邊? style屬性在底部?關(guān)閉標(biāo)簽/單獨(dú)起一行

26、,有助于調(diào)整和添加新的屬性? 考慮使用DeSigntime attributes 設(shè)計(jì)時(shí)布局屬性,Android StUdiO已經(jīng) 提供支持,而不是硬編碼an droid:text(譯者注:墻內(nèi)也可以參考StOrmZhang的這篇博客 鏈接)。<?xml VerSiOn ="1.0"encoding="utf-8"?>BnlIVLin earLayoutxmln s:a ndroid="match_Pare nt" ="match_Pare nt" = "vertical"xmln

27、s:tools =""an droid:layout_Widthan droid:layout_heightan droid:orie ntatio nV TeXtVieWan droid:id="+id/name"an droid:layout_Width="match_Pare nt"an droid:layout_height="wrap_c onten t"an droid:layout_alig nPare ntRight="true"an droid:text="Str i

28、ng/n ame"style ="style/Fa ncyText"/>Vin cludelayout ="layout/reusable_part"/>作為一個(gè)經(jīng)驗(yàn)法則,android:IayoUt_*屬性應(yīng)該在layout XML中定義,同時(shí)其它屬性an droid:* 應(yīng)放在StyIer XML中。此規(guī)則也有例外,不過大體工作的很好。這個(gè)思想整體是保持 layout屬性(POSitioning, margin, SiZing) 和 COntent 屬性在布局文件中,同時(shí)將所有的外觀細(xì)節(jié)屬性(colors, Padding, f

29、ont )放在 style文件中。例外有以下這些:? android:id明顯應(yīng)該在IayOUt文件中? layout 文件中 android:orientation對(duì)于一個(gè) LinearLayout 布局通常更有意義? android:text由于是定義內(nèi)容,應(yīng)該放在layout文件中?有時(shí)候?qū)?android:layout_Width和 android:layout_height屬性放到一個(gè)style中作為一個(gè)通用的風(fēng)格中更有意義,但是默認(rèn)情況下這些應(yīng)該放到 layout文件中。使用StyIeS幾乎每個(gè)項(xiàng)目都需要適當(dāng)?shù)氖褂?style文件,因?yàn)閷?duì)于一個(gè)視圖來 說有一個(gè)重復(fù)的外觀是很常見的。

30、在應(yīng)用中對(duì)于大多數(shù)文本內(nèi)容,最起碼你應(yīng)該有一個(gè)通用的style文件,例如:<stylen ame="C onten tText">V item name="android:textSize">dimen/font_normal</item >V item name="android:textColor">color/basic_black</ item ></ style >應(yīng)用到TeXtVieW中:VTeXtVieWan droid:layout_Width="w

31、rap_c on te nt"an droid:layout_height="wrap_c Ontent"an droid:text="Stri ng/price"style ="style/Co nte ntText"/>你或許需要為按鈕控件做同樣的事情,不要停止在那里。將一組相關(guān)的和重復(fù)an droid:*的屬性放到一個(gè)通用的 Style中。將一個(gè)大的Style文件分割成多個(gè)文件你可以有多個(gè)StyIeS.xml文件。Android SDK支持其它文件,StyIeS這個(gè)文件名稱并沒有作用,起作用的是在 文件里Xml的

32、VStyle>標(biāo)簽。因此你可以有多個(gè)style文件StyIeS.xml ,style_home.xml ,style_item_details.xml,styles_forms.xml。不用于資源文件路徑需要為系統(tǒng)構(gòu)建起的有意義,在res/values目錄下的文件可以任意命名。ColorS.xml是一個(gè)調(diào)色板在你的colors.xml文件中應(yīng)該只是映射顏色的名稱一個(gè)RGBA值,而沒有其它的。不要使用它為不同的按鈕來定義RGBA值不要這樣做VreSOUrCeS >V colorname="button_foreground">#FFFFFF</ col

33、or >V colorname="button_background">#2A91BD</ color >V colorname="comment_baCkgrOUnd_inactive">#5F5F5F</ color >V colorname="comment_baCkgrOUnd_active">#939393</ color >V colorname="comment_foreground">#FFFFFFv/ color >V col

34、orname="comment_foreground_important">#FF9D2Fv/ color >V colorname="comment_shadow" >#323232v/ color >使用這種格式,你會(huì)非常容易的開始重復(fù)定義 RGBA值,這使如果需要改變基 本色變的很復(fù)雜。同時(shí),這些定義是跟一些環(huán)境關(guān)聯(lián)起來的,如butt on或者comme nt,應(yīng)該放到一個(gè)按鈕風(fēng)格中,而不是在 color.xml 文件中。相反,這樣做:VreSOUrCeS >v!- grayScale ->Vcolorn ame

35、="white">#FFFFFFv/color>Vcolorn ame="gray_light">#DBDBDBV/color>Vcolorn ame="gray">#939393</color>Vcolorn ame="gray_dark">#5F5F5F</color>Vcolorn ame="black">#323232</color>v!- baSic colorS ->V color name=&quo

36、t;green" >#27D34Dv/ color >V color name="blue" >#2A91BDv/ color >V colorname="orange" >#FF9D2Fv/ color >V color name="red" >#FF432F</ color >v/ resources >向應(yīng)用設(shè)計(jì)者那里要這個(gè)調(diào)色板,名稱不需要跟"green", "blue",等等相同。"bra nd_prima

37、ry", "bra nd_sec on dary", "bra nd_n egative"這樣的名字也是完全可以接受的。像這樣規(guī)范的顏色很容易修改或重構(gòu),會(huì)使應(yīng)用一共使用了多少種 不同的顏色變得非常清晰。通常一個(gè)具有審美價(jià)值的Ul來說,減少使用顏色 的種類是非常重要的。像對(duì)待colors.xml 一樣對(duì)待dimens.xml文件與定義顏色調(diào)色板一樣,你同 時(shí)也應(yīng)該定義一個(gè)空隙間隔和字體大小的調(diào)色板” 一個(gè)好的例子,如下所示:VreSOUrCeS ><!- font SiZeS ->>22sp</ dimen >

38、;>18sp</ dimen >V dime n n ame="fo nt_larger"V dime n n ame="fo nt_large"Vdime nn ame= "font_no rmal">15sp</ dimen >Vdime nn ame="fo nt_small">12sp</ dimen >v!- typical SPaC ing betwee n two VieWS ->Vdime nn ame= "spac in g_h

39、uge">40dp</ dimen >Vdime nn ame= "spac in g_large">24dp</ dimen >Vdime nn ame= "spaci ng_n ormalH>14dp</ dimen >Vdime nn ame= "spac in g_small">10dp</ dimen >Vdime nn ame= "spac in g_ti ny">4dp</ dimen ><!- typic

40、al SiZeS Of VieWS ->Vdime nn ame= "butt on _height_tall">60dp</ dimen >Vdime nn ame= "butt on _height_ no rmal">40dp</ dimen >Vdime nn ame= "butt on _height_short">32dp</ dimen >v/ resources>布局時(shí)在寫 margins 和Paddings 時(shí),你應(yīng)該使用 SPaCing_*尺寸格式來

41、布局,而不是像對(duì)待String字符串一樣直接寫值。這樣寫會(huì)非常有感覺,會(huì)使組織和 改變風(fēng)格或布局是非常容易。避免深層次的視圖結(jié)構(gòu)有時(shí)候?yàn)榱藬[放一個(gè)視圖,你可能嘗試添加另一個(gè)LinearLayout。你可能使用這種方法解決:="match_Pare nt" ="match_Pare nt" = "vertical"VLin earLayoutan droid:IayOUt_width an droid:layout_height an droid:orie ntatio n>V ReIatiVeLayOUt>VLin ear

42、Layout>VLin earLayout>VLin earLayout>v/Lin earLayout>v/Lin earLayout>v/Lin earLayout>v/ReIatiVeLayOUt>v/ LinearLayout>即使你沒有非常明確的在一個(gè)layout布局文件中這樣使用,如果你在 JaVa文 件中從一個(gè)VieW inflate (這個(gè)inflate翻譯不過去,大家理解就行)到其他VieWS當(dāng)中,也是可能會(huì)發(fā)生的??赡軙?huì)導(dǎo)致一系列的問題。你可能會(huì)遇到性能問題,因?yàn)樘幚砥鹦枰幚硪粋€(gè) 復(fù)雜的Ul樹結(jié)構(gòu)。還可能會(huì)導(dǎo)致以下更嚴(yán)重的問

43、題 StaCkOVerfloWErrOr .因此盡量保持你的視圖tree:學(xué)習(xí)如何使用ReIatiVeLayOUt ,如何OPtimiZe你 的布局和如何使用merge標(biāo)簽.小心關(guān)于WebVieWS的問題.如果你必須顯示一個(gè)Web視圖,比如說對(duì)于一個(gè) 新聞文章,避免做客戶端處理 HTML的工作,最好讓后端工程師協(xié)助,讓他返 回一個(gè)"純"HTML。WebVieWS也能導(dǎo)致內(nèi)存泄露 當(dāng)保持引他們的ACtiVity, 而不是被綁定到APPIiCatiOnContext中的時(shí)候。當(dāng)使用簡(jiǎn)單的文字或按鈕時(shí), 避免使用 WebVieW ,這時(shí)使用TeXtVieW或Buttons更好。測(cè)

44、試框架Android SDK的測(cè)試框架還處于初級(jí)階段,特別是關(guān)于 UI測(cè)試方面。Android GradIe目前實(shí)現(xiàn)了一個(gè)叫connectedAndroidTest的測(cè)試,它使用一個(gè)JUnit為Android 提供的擴(kuò)展插件 extension of JUnit With helpers for Android .可以跑你 生成的JUnit測(cè)試,只當(dāng)做單元測(cè)試時(shí)使用 Robolectric ,VieWS不用它是一個(gè)最求提供"不連接 設(shè)備的"為了加速開發(fā)的測(cè)試,非常時(shí)候做models和VieW models的單元測(cè)試然而,使用Robolectric測(cè)試時(shí)不精確的,也不完全對(duì)

45、UI測(cè)試。當(dāng)你對(duì)有關(guān)動(dòng) 畫的UI元素、對(duì)話框等,測(cè)試時(shí)會(huì)有問題,這主要是因?yàn)槟闶窃?在黑暗中工作”(在沒有可控的界面情況下測(cè)試)solo . SendKey(Solo solo . clickOnText( CIiCkS on itsolo . clickOnText( solo . clickOnText(*Robotium使寫UI測(cè)試非常簡(jiǎn)單。*對(duì)于UI測(cè)試你不需Robotium跑與設(shè)備 連接的測(cè)試。但它可能會(huì)對(duì)你有益,是因?yàn)樗性S多來幫助類的獲得和分析視 圖,控制屏幕。測(cè)試用例看起來像這樣簡(jiǎn)單:.MENU;"More" );/ SearCheS for the fir

46、st occurence of "More" and"Prefere nces");"Edit ");ASSert . assertTrue(solo . SearChText("rtf" );模擬器 如果你全職開發(fā) Android App,那么買一個(gè) Genymotion emulator IiCense 吧。Genymotion模擬器運(yùn)行更快的秒幀的速度,比起典型的AVD模擬器。他有演示你APP的工具,高質(zhì)量的模擬網(wǎng)絡(luò)連接,GPS位置,等等。它同時(shí)還有理想的連接測(cè)試。你若涉及適配使用很多不同的設(shè)備,買一個(gè) Ge

47、nymotion版權(quán) 是比你買很多真設(shè)備便宜多的。注意:Genymotion模擬器沒有裝載所有的 Google服務(wù),如Google PlayStore和MaPS。你也可能需 要測(cè)試SamSUng指定的API ,若這樣的話你還是 需要購(gòu)買一個(gè)真實(shí)的SamSUng設(shè)備。混淆配置PrOGUard是一個(gè)在Android項(xiàng)目中廣泛使用的壓縮和混淆打包的源碼的工具。你是否使用PrOGUard取決你項(xiàng)目的配置,當(dāng)你構(gòu)建一個(gè) release版本的apk 時(shí),通常你應(yīng)該配置gradle文件。buildTypes debug minifyEn abledfalserelease SigningConfig SigningConfigs. releaseminifyEn abledtruePrOgUardFiIeS''為了決定哪些代碼應(yīng)該被保留,哪些代碼應(yīng)該被混淆

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫(kù)網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。

最新文檔

評(píng)論

0/150

提交評(píng)論