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

下載本文檔

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

文檔簡(jiǎn)介

1、Android 開(kāi)發(fā)最佳實(shí)踐從 HYPERLINK / Futurice公司Android開(kāi)發(fā)者中學(xué)到的經(jīng)驗(yàn)。 遵循以下準(zhǔn)則,避免重復(fù)發(fā)明輪子。若您對(duì)開(kāi)發(fā)iOS或Windows Phone 有興趣, 請(qǐng)看 HYPERLINK /futurice/ios-good-practices iOS Good Practices和 HYPERLINK /futurice/win-client-dev-good-practices Windows client Good Practices這兩篇文章。摘要使用 Gradle 和它推薦的工程結(jié)構(gòu)把密碼和敏感數(shù)據(jù)放在perties不要自己寫 HTTP 客戶端,

2、使用Volley或OkHttp庫(kù)使用Jackson庫(kù)解析JSON數(shù)據(jù)避免使用Guava同時(shí)使用一些類庫(kù)來(lái)避免65k method limit(一個(gè)Android程序中最多能執(zhí)行65536個(gè)方法)使用 Fragments來(lái)呈現(xiàn)UI視圖使用 Activities 只是為了管理 FragmentsLayout 布局是 XMLs代碼,組織好它們?cè)趌ayoutout XMLs布局時(shí),使用styles文件來(lái)避免使用重復(fù)的屬性使用多個(gè)style文件來(lái)避免單一的一個(gè)大style文件保持你的colors.xml 簡(jiǎn)短DRY(不要重復(fù)自己),只是定義調(diào)色板總是使用dimens.xml DRY(不要重復(fù)自己),定義

3、通用常數(shù)不要做一個(gè)深層次的ViewGroup在使用WebViews時(shí)避免在客戶端做處理,當(dāng)心內(nèi)存泄露使用Robolectric單元測(cè)試,Robotium 做UI測(cè)試使用Genymotion 作為你的模擬器總是使用ProGuard 和 DexGuard混淆來(lái)項(xiàng)目Android SDK將你的 HYPERLINK /sdk/installing/index.html?pkg=tools Android SDK放在你的home目錄或其他應(yīng)用程序無(wú)關(guān)的位置。 當(dāng)安裝有些包含SDK的IDE的時(shí)候,可能會(huì)將SDK放在IDE同一目錄下,當(dāng)你需要升級(jí)(或重新安裝)IDE或更換的IDE時(shí),會(huì)非常麻煩。 此外,若果

4、你的IDE是在普通用戶,不是在root下運(yùn)行,還要避免吧SDK放到一下需要sudo權(quán)限的系統(tǒng)級(jí)別目錄下。構(gòu)建系統(tǒng)你的默認(rèn)編譯環(huán)境應(yīng)該是 HYPERLINK /tech-docs/new-build-system Gradle. Ant 有很多限制,也很冗余。使用Gradle,完成以下工作很方便:構(gòu)建APP不同版本的變種制作簡(jiǎn)單類似腳本的任務(wù)管理和下載依賴自定義秘鑰更多同時(shí),Android Gradle插件作為新標(biāo)準(zhǔn)的構(gòu)建系統(tǒng)正在被Google積極的開(kāi)發(fā)。工程結(jié)構(gòu)有兩種流行的結(jié)構(gòu):老的Ant & Eclipse ADT 工程結(jié)構(gòu),和新的Gradle & Android Studio 工程結(jié)構(gòu),

5、你應(yīng)該選擇新的工程結(jié)構(gòu),如果你的工程還在使用老的結(jié)構(gòu),考慮放棄吧,將工程移植到新的結(jié)構(gòu)。老的結(jié)構(gòu):old-structure assets libs res src com/futurice/project AndroidManifest.xml build.gradle perties 新的結(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 bui

6、ld.gradle settings.gradle主要的區(qū)別在于,新的結(jié)構(gòu)明確的分開(kāi)了source sets (main,androidTest),Gradle的一個(gè)理念。 你可以做到,例如,添加源組paid和free在src中,這將成為您的應(yīng)用程序的付費(fèi)和免費(fèi)的兩種模式的源代碼。你的項(xiàng)目引用第三方項(xiàng)目庫(kù)時(shí)(例如,library-foobar),擁有一個(gè)頂級(jí)包名app從第三方庫(kù)項(xiàng)目區(qū)分你的應(yīng)用程序是非常有用的。 然后settings.gradle不斷引用這些庫(kù)項(xiàng)目,其中app/build.gradle可以引用。Gradle 配置常用結(jié)構(gòu)參考 HYPERLINK /tech-docs/new-b

7、uild-system/user-guide Googles guide on Gradle for Android小任務(wù)除了(shell, Python, Perl, etc)這些腳本語(yǔ)言,你也可以使用Gradle 制作任務(wù)。 更多信息請(qǐng)參考 HYPERLINK /docs/current/userguide/userguide_single.html l N10CBF Gradles documentation。密碼在做版本release時(shí)你app的build.gradle你需要定義signingConfigs.此時(shí)你應(yīng)該避免以下內(nèi)容:不要做這個(gè). 這會(huì)出現(xiàn)在版本控制中。signingCo

8、nfigs release storeFile file(myapp.keystore) storePassword password123 keyAlias thekey keyPassword password789 而是,建立一個(gè)不加入版本控制系統(tǒng)的perties文件。KEYSTORE_PASSWORD=password123KEY_PASSWORD=password789那個(gè)文件是gradle自動(dòng)引入的,你可以在buld.gradle文件中使用,例如:signingConfigs release try storeFile file(myapp.keystore) storePassw

9、ord KEYSTORE_PASSWORD keyAlias thekey keyPassword KEY_PASSWORD catch (ex) throw new InvalidUserDataException(You should define KEYSTORE_PASSWORD and KEY_PASSWORD in perties.) 使用 Maven 依賴方案代替使用導(dǎo)入jar包方案如果在你的項(xiàng)目中你明確使用率 jar文件,那么它們可能成為永久的版本,如2.1.1.下載jar包更新他們是很繁瑣的, 這個(gè)問(wèn)題Maven很好的解決了,這在Android Gradle構(gòu)建中也是推薦的方

10、法。你可 以指定版本的一個(gè)范圍,如2.1.+,然后Maven會(huì)自動(dòng)升級(jí)到制定的最新版本,例如:dependencies compile flix.rxjava:rxjava-core:0.19.+ compile flix.rxjava:rxjava-android:0.19.+ compile com.fasterxml.jackson.core:jackson-databind:2.4.+ compile com.fasterxml.jackson.core:jackson-core:2.4.+ compile com.fasterxml.jackson.core:jackson-anno

11、tations:2.4.+ compile com.squareup.okhttp:okhttp:2.0.+ compile com.squareup.okhttp:okhttp-urlconnection:2.0.+IDEs and text editorsIDE集成開(kāi)發(fā)環(huán)境和文本編輯器無(wú)論使用什么編輯器,一定要構(gòu)建一個(gè)良好的工程結(jié)構(gòu)編輯器每個(gè)人都有自己的 選擇,讓你的編輯器根據(jù)工程結(jié)構(gòu)和構(gòu)建系統(tǒng)運(yùn)作,那是你自己的責(zé)任。當(dāng)下首推 HYPERLINK /sdk/installing/studio.html Android Studio,因?yàn)樗怯晒雀栝_(kāi)發(fā),最接近Gradle,默認(rèn)使用最新的工程

12、結(jié)構(gòu),已經(jīng)到beta階段 (目前已經(jīng)有release 1.0了),它就是為Android開(kāi)發(fā)定制的。你也可以使用 HYPERLINK /sdk/installing/index.html?pkg=adt Eclipse ADT,但是你需要對(duì)它進(jìn)行配置,因?yàn)樗褂昧伺f的工程結(jié)構(gòu) 和Ant作為構(gòu)建系統(tǒng)。你甚至可以使用純文版編輯器如Vim,Sublime Text,或者Emacs。如果那樣的話,你需要使用Gardle和adb命令行。如果使用Eclipse集成Gradle 不適合你,你只是使用命令行構(gòu)建工程,或遷移到Android Studio中來(lái)吧。無(wú)論你使用何種開(kāi)發(fā)工具,只要確保Gradle和新的

13、項(xiàng)目結(jié)構(gòu)保持官方的方式構(gòu)建應(yīng)用程序,避免你的編輯器配置文件加入到版本控制。例如,避免加入Antbuild.xml文件。 特別如果你改變Ant的配置,不要忘記保持build.gradle是最新和起作用的。同時(shí),善待其他開(kāi)發(fā)者,不要強(qiáng)制改變他們的開(kāi)發(fā)工具和偏好。類庫(kù) HYPERLINK /JacksonHome Jackson是一個(gè)將java對(duì)象轉(zhuǎn)換成JSON與JSON轉(zhuǎn)化java類的類庫(kù)。 HYPERLINK /p/google-gson/ Gson是解決這個(gè)問(wèn)題的流行方案,然而我們發(fā)現(xiàn)Jackson更高效,因?yàn)樗С痔娲姆椒ㄌ幚鞪SON:流、內(nèi)存樹(shù)模型,和傳統(tǒng)JSON-POJO數(shù)據(jù)綁定。不過(guò)

14、,請(qǐng)記住, Jsonkson庫(kù)比起GSON更大,所以根據(jù)你的情況選擇,你可能選擇GSON來(lái)避免APP 65k個(gè)方法限制。其它選擇: HYPERLINK /p/json-smart/ Json-smartand HYPERLINK /RichardHightower/boon/wiki/Boon-JSON-in-five-minutes Boon JSON網(wǎng)絡(luò)請(qǐng)求,緩存,圖片執(zhí)行請(qǐng)求后端服務(wù)器,有幾種交互的解決方案,你應(yīng)該考慮實(shí)現(xiàn)你自己的網(wǎng)絡(luò)客戶端。使用 HYPERLINK /platform/frameworks/volley Volley或 HYPERLINK http:/square.gi

15、thub.io/retrofit/ Retrofit。Volley 同時(shí)提供圖片緩存類。若果你選擇使用Retrofit,那么考慮使用 HYPERLINK http:/square.github.io/picasso/ Picasso來(lái)加載圖片和緩存,同時(shí)使用 HYPERLINK http:/square.github.io/okhttp/ OkHttp作為高效的網(wǎng)絡(luò)請(qǐng)求。Retrofit,Picasso和OkHttp都是有同一家公司開(kāi)發(fā)(注: 是由 HYPERLINK /square Square公司開(kāi)發(fā)),所以它們能很好的在一起運(yùn)行。 HYPERLINK /questions/2437504

16、3/how-to-implement-android-volley-with-okhttp-2-0/24951835 l 24951835 OkHttp 同樣可以和Volley在一起使用 Volley.RxJava是函數(shù)式反應(yīng)性的一個(gè)類庫(kù),換句話說(shuō),能處理異步的事件。 這是一個(gè)強(qiáng)大的和有前途的模式,同時(shí)也可能會(huì)造成混淆,因?yàn)樗侨绱说牟煌?我們建議在使用這個(gè)庫(kù)架構(gòu)整個(gè)應(yīng)用程序之前要謹(jǐn)慎考慮。 有一些項(xiàng)目是使用RxJava完成的,如果你需要幫助可以跟這些人取得聯(lián)系: Timo Tuominen, Olli Salonen, Andre Medeiros, Mark Voit, Antti La

17、mmi, Vera Izrailit, Juha Ristolainen. 我們也寫了一些博客: HYPERLINK /tech-pick-of-the-week-rx-for-net-and-rxjava-for-android 1, HYPERLINK /top-7-tips-for-rxjava-on-android 2, HYPERLINK /staltz/868e7e9bc2a7b8c1f754 3, HYPERLINK /android-development-has-its-own-swift 4.如若你之前有使用過(guò)Rx的經(jīng)歷,開(kāi)始從API響應(yīng)應(yīng)用它。 另外,從簡(jiǎn)單的UI事件處理

18、開(kāi)始運(yùn)用,如單擊事件或在搜索欄輸入事件。 若對(duì)你的Rx技術(shù)有信心,同時(shí)想要將它應(yīng)用到你的整體架構(gòu)中,那么請(qǐng)?jiān)趶?fù)雜的部分寫好Javadocs文檔。 請(qǐng)記住其他不熟悉RxJava的開(kāi)發(fā)人員,可能會(huì)非常難理解整個(gè)項(xiàng)目。 盡你的的全力幫助他們理解你的代碼和Rx。 HYPERLINK /evant/gradle-retrolambda Retrolambda是一個(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è)置成為S

19、DK路徑,同時(shí)設(shè)置JAVA8_HOME和JAVA7_HOME環(huán)境變量, 然后在工程根目錄下配置 build.gradle:dependencies classpath me.tatarka:gradle-retrolambda:2.4.+同時(shí)在每個(gè)module 的build.gradle中添加apply plugin: retrolambdaandroid compileOptions sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8retrolambda jdk Sy

20、stem.getenv(JAVA8_HOME) oldJdk System.getenv(JAVA7_HOME) javaVersion JavaVersion.VERSION_1_7Android Studio 提供Java8 lambdas表帶是代碼提示支持。如果你對(duì)lambdas不熟悉,只需參照以下開(kāi)始學(xué)習(xí)吧:任何只包含一個(gè)接口的方法都是lambda friendly同時(shí)代碼可以被折疊成更緊湊的語(yǔ)法如果對(duì)參數(shù)或類似有疑問(wèn),就寫一個(gè)普通的匿名內(nèi)部類,然后讓Android Status為你生成一個(gè)lambda。當(dāng)心dex方法數(shù)限制,同時(shí)避免使用過(guò)多的類庫(kù)Android apps,當(dāng)打包成一個(gè)

21、dex文件時(shí),有一個(gè)65535個(gè)應(yīng)用方法強(qiáng)硬限制 HYPERLINK /rotxed/dex-skys-the-limit-no-65k-methods-is-28e6cb40cf71 1 HYPERLINK /2014/05/per-package-method-counts-for-androids.html 2 HYPERLINK /play-services-is-a-monolith/ 3。 當(dāng)你突破65k限制之后你會(huì)看到一個(gè)致命錯(cuò)誤。因此,使用一個(gè)正常范圍的類庫(kù)文件,同時(shí)使用 HYPERLINK /mihaip/dex-method-counts dex-method-counts

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

23、的應(yīng)用在最初就使用了fragments,那么以后將你的應(yīng)用適配到其他不同尺寸屏幕就會(huì)非常簡(jiǎn)單。屏幕間數(shù)據(jù)通信從一個(gè)Activity發(fā)送復(fù)雜數(shù)據(jù)(例如Java對(duì)象)到另外一個(gè)Activity,Android的API并沒(méi)有提供合適的方法。不過(guò)使用Fragment,你可以使用 一個(gè)activity實(shí)例作為這個(gè)activity子fragments的通信通道。即使這樣比Activity與Activity間的通信好,你也想考慮使用Event Bus架構(gòu),使用如 HYPERLINK https:/square.github.io/otto/ Otto或者 HYPERLINK /greenrobot/Even

24、tBus greenrobot EventBus作為更簡(jiǎn)潔的實(shí)現(xiàn)。 如果你希望避免添加另外一個(gè)類庫(kù),RxJava同樣可以實(shí)現(xiàn)一個(gè)Event Bus。Fragments 一般通用的不只有UI你可以有一個(gè)沒(méi)有界面的fragment作為Activity提供后臺(tái)工作。 進(jìn)一步你可以使用這個(gè)特性來(lái)創(chuàng)建一個(gè) HYPERLINK /questions/12363790/how-many-activities-vs-fragments/12528434 l 12528434 fragment 包含改變其它fragment的邏輯而不是把這個(gè)邏輯放在activity中。甚至ActionBar 都可以使用內(nèi)部fra

25、gment來(lái)管理你可以選擇使用一個(gè)沒(méi)有UI界面的fragment來(lái)專門管理ActionBar,或者你可以選擇使用在每個(gè)Fragment中 添加它自己的action 來(lái)作為父Activity的ActionBar. HYPERLINK /adding-action-items-from-within-fragments/ 參考.很不幸,我們不建議廣泛的使用嵌套的 HYPERLINK /about/versions/android-4.2.html l NestedFragments fragments,因?yàn)?有時(shí)會(huì)引起 HYPERLINK http:/delyan.me/android-s-mat

26、ryoshka-problem/ matryoshka bugs。我們只有當(dāng)它有意義(例如,在水平滑動(dòng)的ViewPager在 像屏幕一樣fragment中)或者他的確是一個(gè)明智的選擇的時(shí)候才廣泛的使用fragment。在一個(gè)架構(gòu)級(jí)別,你的APP應(yīng)該有一個(gè)頂級(jí)的activity來(lái)包含絕大部分業(yè)務(wù)相關(guān)的fragment。你也可能還有一些輔助的activity ,這些輔助的activity與主activity 通信很簡(jiǎn)單限制在這兩種方法 HYPERLINK /reference/android/content/Intent.html l setData(.Uri) Intent.setData()或

27、 HYPERLINK /reference/android/content/Intent.html l setAction(java.lang.String) Intent.setAction()或類似的方法。Java 包結(jié)構(gòu)Android 應(yīng)用程序在架構(gòu)上大致是Java中的 HYPERLINK /wiki/Model%E2%80%93view%E2%80%93controller Model-View-Controller結(jié)構(gòu)。 在Android 中 Fragment和Activity通常上是控制器類( HYPERLINK /articles/article.aspx?p=2126865 /

28、articles/article.aspx?p=2126865). 換句話說(shuō),他們是用戶接口的部分,同樣也是Views視圖的部分。正是因?yàn)槿绱?,才很難嚴(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ù),來(lái)填充的POJO的mode

29、ls包中。 和一個(gè)views包來(lái)包含你的自定義視圖、通知、導(dǎo)航視圖,widgets等等。 適配器Adapter是在數(shù)據(jù)和視圖之間。然而他們通常需要通過(guò)getView()方法來(lái)導(dǎo)出一些視圖, 所以你可以將adapters包放在views包里面。一些控制器角色的類是應(yīng)用程序級(jí)別的,同時(shí)是接近系統(tǒng)的。 這些類放在managers包下面。 一些繁雜的數(shù)據(jù)處理類,比如說(shuō)DateUtils,放在utils包下面。 與后端交互負(fù)責(zé)網(wǎng)絡(luò)處理類,放在network包下面??偠灾?,以最接近用戶而不是最接近后端去安排他們。ject network models managers utils fragments v

30、iews adapters actionbar widgets notifications資源文件 Resources命名遵循前綴表明類型的習(xí)慣,形如type_foo_bar.xml。例如:fragment_contact_details.xml,view_primary_button.xml,activity_main.xml.組織布局文件若果你不確定如何排版一個(gè)布局文件,遵循一下規(guī)則可能會(huì)有幫助。每一個(gè)屬性一行,縮進(jìn)4個(gè)空格android:id總是作為第一個(gè)屬性android:layout_*屬性在上邊style屬性在底部關(guān)閉標(biāo)簽/單獨(dú)起一行,有助于調(diào)整和添加新的屬性考慮使用 HYPERL

31、INK /tips/layout-designtime-attributes Designtime attributes 設(shè)計(jì)時(shí)布局屬性,Android Studio已經(jīng)提供支持,而不是硬編碼android:text(譯者注:墻內(nèi)也可以參考stormzhang的這篇博客 HYPERLINK /devtools/2015/01/11/android-studio-tips1/ 鏈接)。 作為一個(gè)經(jīng)驗(yàn)法則,android:layout_*屬性應(yīng)該在 layout XML 中定義,同時(shí)其它屬性android:*應(yīng)放在 styler XML中。此規(guī)則也有例外,不過(guò)大體工作 的很好。這個(gè)思想整體是保持l

32、ayout屬性(positioning, margin, sizing) 和content屬性在布局文件中,同時(shí)將所有的外觀細(xì)節(jié)屬性(colors, padding, font)放 在style文件中。例外有以下這些:android:id明顯應(yīng)該在layout文件中l(wèi)ayout文件中android:orientation對(duì)于一個(gè)LinearLayout布局通常更有意義android:text由于是定義內(nèi)容,應(yīng)該放在layout文件中有時(shí)候?qū)ndroid:layout_width和android:layout_height屬性放到一個(gè)style中作為一個(gè)通用的風(fēng)格中更有意義,但是默認(rèn)情況下這些

33、應(yīng)該放到layout文件中。使用styles幾乎每個(gè)項(xiàng)目都需要適當(dāng)?shù)氖褂胹tyle文件,因?yàn)閷?duì)于一個(gè)視圖來(lái)說(shuō)有一個(gè)重復(fù)的外觀是很常見(jiàn)的。 在應(yīng)用中對(duì)于大多數(shù)文本內(nèi)容,最起碼你應(yīng)該有一個(gè)通用的style文件,例如: dimen/font_normal color/basic_black應(yīng)用到TextView 中:你或許需要為按鈕控件做同樣的事情,不要停止在那里。將一組相關(guān)的和重復(fù)android:*的屬性放到一個(gè)通用的style中。將一個(gè)大的style文件分割成多個(gè)文件你可以有多個(gè)styles.xml文件。Android SDK支持其它文件,styles這個(gè)文件名稱并沒(méi)有作用,起作用的是在文件 里

34、xml的標(biāo)簽。因此你可以有多個(gè)style文件styles.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值,而沒(méi)有其它的。不要使用它為不同的按鈕來(lái)定義RGBA值。不要這樣做 #FFFFFF #2A91BD #5F5F5F #939393 #FFFFFF #FF9D2F . #323232使用這種格式,你會(huì)非常容易的開(kāi)始重復(fù)定義RGBA

35、值,這使如果需要改變基本色變的很復(fù)雜。同時(shí),這些定義是跟一些環(huán)境關(guān)聯(lián)起來(lái)的,如button或者comment, 應(yīng)該放到一個(gè)按鈕風(fēng)格中,而不是在color.xml文件中。相反,這樣做: #FFFFFF #DBDBDB #939393 #5F5F5F #323232 #27D34D #2A91BD #FF9D2F #FF432F向應(yīng)用設(shè)計(jì)者那里要這個(gè)調(diào)色板,名稱不需要跟green, blue, 等等相同。 brand_primary, brand_secondary, brand_negative 這樣的名字也是完全可以接受的。 像這樣規(guī)范的顏色很容易修改或重構(gòu),會(huì)使應(yīng)用一共使用了多少種不同的顏

36、色變得非常清晰。 通常一個(gè)具有審美價(jià)值的UI來(lái)說(shuō),減少使用顏色的種類是非常重要的。像對(duì)待colors.xml一樣對(duì)待dimens.xml文件與定義顏色調(diào)色板一樣,你同時(shí)也應(yīng)該定義一個(gè)空隙間隔和字體大小的“調(diào)色板”。 一個(gè)好的例子,如下所示: 22sp 18sp 15sp 12sp 40dp 24dp 14dp 10dp 4dp 60dp 40dp 32dp布局時(shí)在寫 margins 和 paddings 時(shí),你應(yīng)該使用spacing_*尺寸格式來(lái)布局,而不是像對(duì)待String字符串一樣直接寫值。 這樣寫會(huì)非常有感覺(jué),會(huì)使組織和改變風(fēng)格或布局是非常容易。避免深層次的視圖結(jié)構(gòu)有時(shí)候?yàn)榱藬[放一個(gè)視圖

37、,你可能嘗試添加另一個(gè)LinearLayout。你可能使用這種方法解決: 即使你沒(méi)有非常明確的在一個(gè)layout布局文件中這樣使用,如果你在Java文件中從一個(gè)view inflate(這個(gè)inflate翻譯不過(guò)去,大家理解就行) 到其他views當(dāng)中,也是可能會(huì)發(fā)生的。可能會(huì)導(dǎo)致一系列的問(wèn)題。你可能會(huì)遇到性能問(wèn)題,因?yàn)樘幚砥鹦枰幚硪粋€(gè)復(fù)雜的UI樹(shù)結(jié)構(gòu)。 還可能會(huì)導(dǎo)致以下更嚴(yán)重的問(wèn)題 HYPERLINK /questions/2762924/java-lang-stackoverflow-error-suspected-too-many-views StackOverflowError.因此

38、盡量保持你的視圖tree:學(xué)習(xí)如何使用 HYPERLINK /guide/topics/ui/layout/relative.html RelativeLayout, 如何 HYPERLINK /training/improving-layouts/optimizing-layout.html optimize 你的布局和如何使用 HYPERLINK /questions/8834898/what-is-the-purpose-of-androids-merge-tag-in-xml-layouts 標(biāo)簽.小心關(guān)于WebViews的問(wèn)題.如果你必須顯示一個(gè)web視圖, 比如說(shuō)對(duì)于一個(gè)新聞文章,

39、避免做客戶端處理HTML的工作, 最好讓后端工程師協(xié)助,讓他返回一個(gè) 純 HTML。 HYPERLINK /questions/3130654/memory-leak-in-webview WebViews 也能導(dǎo)致內(nèi)存泄露當(dāng)保持引他們的Activity,而不是被綁定到ApplicationContext中的時(shí)候。 當(dāng)使用簡(jiǎn)單的文字或按鈕時(shí),避免使用WebView,這時(shí)使用TextView或Buttons更好。測(cè)試框架Android SDK的測(cè)試框架還處于初級(jí)階段,特別是關(guān)于UI測(cè)試方面。Android Gradle 目前實(shí)現(xiàn)了一個(gè)叫 HYPERLINK /tech-docs/new-buil

40、d-system/user-guide l TOC-Testing connectedAndroidTest的測(cè)試, 它 HYPERLINK /reference/android/test/package-summary.html 使用一個(gè)JUnit 為Android提供的擴(kuò)展插件 extension of JUnit with helpers for Android.可以跑你生成的JUnit測(cè)試,只當(dāng)做單元測(cè)試時(shí)使用 HYPERLINK / Robolectric,views 不用它是一個(gè)最求提供不連接設(shè)備的為了加速開(kāi)發(fā)的測(cè)試, 非常時(shí)候做 models 和 view models 的單元測(cè)

41、試。 然而,使用Robolectric測(cè)試時(shí)不精確的,也不完全對(duì)UI測(cè)試。 當(dāng)你對(duì)有關(guān)動(dòng)畫的UI元素、對(duì)話框等,測(cè)試時(shí)會(huì)有問(wèn)題, 這主要是因?yàn)槟闶窃?“在黑暗中工作”(在沒(méi)有可控的界面情況下測(cè)試)* HYPERLINK /p/robotium/ Robotium使寫UI測(cè)試非常簡(jiǎn)單。 *對(duì)于UI測(cè)試你不需 Robotium 跑與設(shè)備連接的測(cè)試。 但它可能會(huì)對(duì)你有益,是因?yàn)樗性S多來(lái)幫助類的獲得和分析視圖,控制屏幕。 測(cè)試用例看起來(lái)像這樣簡(jiǎn)單:solo.sendKey(Solo.MENU);solo.clickOnText(More); / searches for the first occu

42、rence of More and clicks on itsolo.clickOnText(Preferences);solo.clickOnText(Edit File Extensions);Assert.assertTrue(solo.searchText(rtf);模擬器如果你全職開(kāi)發(fā)Android App,那么買一個(gè) HYPERLINK / Genymotion emulatorlicense吧。 Genymotion 模擬器運(yùn)行更快的秒幀的速度,比起典型的AVD模擬器。他有演示你APP的工具,高質(zhì)量的模擬網(wǎng)絡(luò)連接,GPS位置,等等。它同時(shí)還有理想的連接測(cè)試。 你若涉及適配使用很多

43、不同的設(shè)備,買一個(gè)Genymotion 版權(quán)是比你買很多真設(shè)備便宜多的。注意:Genymotion模擬器沒(méi)有裝載所有的Google服務(wù),如Google Play Store和Maps。你也可能需 要測(cè)試Samsung指定的API,若這樣的話你還是需要購(gòu)買一個(gè)真實(shí)的Samsung設(shè)備?;煜渲?HYPERLINK / ProGuard是一個(gè)在Android項(xiàng)目中廣泛使用的壓縮和混淆打包的源碼的工具。你是否使用ProGuard取決你項(xiàng)目的配置,當(dāng)你構(gòu)建一個(gè)release版本的apk時(shí),通常你應(yīng)該配置gradle文件。buildTypes debug minifyEnabled false rele

44、ase signingConfig signingConfigs.release minifyEnabled true proguardFiles 為了決定哪些代碼應(yīng)該被保留,哪些代碼應(yīng)該被混淆,你不得不指定一個(gè)或多個(gè)實(shí)體類在你的代碼中。 這些實(shí)體應(yīng)該是指定的類包含main方法,applets,midlets,activities,等等。 Android framework 使用一個(gè)默認(rèn)的配置文件,可以在SDK_HOME/tools/proguard/proguard-android.txt目錄下找到。自定義的工程指定的 project-specific 混淆規(guī)則,如在my-project/app/中定義, 會(huì)被添加到默認(rèn)的配置中。關(guān)于 ProGuard 一個(gè)普遍的問(wèn)題,是看應(yīng)用程序是否崩潰并報(bào)ClassNotFo

溫馨提示

  • 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝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ù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
  • 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)論