隨著移動(dòng)平臺(tái)的發(fā)展和其應(yīng)用的不斷改善,質(zhì)量成為決定成敗的關(guān)鍵。用戶要求他們選擇安裝的應(yīng)用響應(yīng)快、性能好,如果某個(gè)應(yīng)用不能提供卓越的功能和穩(wěn)定的用戶體驗(yàn),那這樣的應(yīng)用注定會(huì)被很快卸載。
創(chuàng)新互聯(lián)建站憑借專業(yè)的設(shè)計(jì)團(tuán)隊(duì)扎實(shí)的技術(shù)支持、優(yōu)質(zhì)高效的服務(wù)意識(shí)和豐厚的資源優(yōu)勢,提供專業(yè)的網(wǎng)站策劃、成都網(wǎng)站制作、做網(wǎng)站、網(wǎng)站優(yōu)化、軟件開發(fā)、網(wǎng)站改版等服務(wù),在成都十多年的網(wǎng)站建設(shè)設(shè)計(jì)經(jīng)驗(yàn),為成都上千中小型企業(yè)策劃設(shè)計(jì)了網(wǎng)站。
盡管現(xiàn)在android智能手機(jī)和平板電腦的運(yùn)行速率越來越快,但開發(fā)者仍需牢記,應(yīng)用的運(yùn)行環(huán)境仍受到電池和處理器等諸多資源的限制。以下是給android應(yīng)用開發(fā)者10個(gè)建議,以便能在當(dāng)前和以后的所有android設(shè)備都能運(yùn)行出最佳效果。
1.首先要有良好的編碼習(xí)慣
一個(gè)優(yōu)秀的android應(yīng)用開發(fā)者應(yīng)該善于運(yùn)用常識(shí)、完善的算法和標(biāo)準(zhǔn)設(shè)計(jì)模式。要有資源意識(shí),打開了就要記得關(guān)閉,盡量做到晚獲取,早釋放。這些由來已久的編碼準(zhǔn)則同樣適用Android應(yīng)用開發(fā),尤其是使用基礎(chǔ)設(shè)備服務(wù)時(shí)。
2.讓阻塞操作遠(yuǎn)離主UI線程
通過使用AsyncTask、線程、IntentService和自定義后臺(tái)服務(wù),保證應(yīng)用的靈活性。使用加載工具簡化游標(biāo)等長時(shí)間加載數(shù)據(jù)的狀態(tài)管理。當(dāng)有其他程序運(yùn)行時(shí),不能讓應(yīng)用滯后或中止。
如果一個(gè)操作需要消耗較多時(shí)間和資源時(shí),取消該操作,換成異步處理,這樣應(yīng)用就能保持響應(yīng),用戶可以繼續(xù)各種操作。該方法適用磁盤讀寫、訪問內(nèi)容提供方、數(shù)據(jù)庫和互聯(lián)網(wǎng),以及解析和其他需要花費(fèi)較長時(shí)間的任務(wù)。
3.使用最新的android SDK版本和API
使用android平臺(tái)的最新產(chǎn)品,保證應(yīng)用緊跟android的更新步伐。隨著android平臺(tái)的不斷發(fā)展,部分功能可能被棄用或被更好的功能取代,核心API接收了bug修復(fù)和性能改進(jìn),新API有助于android應(yīng)用開發(fā)者編寫出更穩(wěn)定的應(yīng)用。要明白最佳的做法總是隨著時(shí)間的推移而變,聰明的android應(yīng)用開發(fā)者應(yīng)該總是站在整個(gè)平臺(tái)的最前沿。
4.考慮使用StrictMode
從android 2.3開始提供了一個(gè)新的類StrictMode,該類可以用于捕捉發(fā)生在應(yīng)用程序主線程中耗時(shí)的磁盤、網(wǎng)絡(luò)訪問或函數(shù)調(diào)用,可以幫助開發(fā)者改進(jìn)程序,使主線程處理UI和動(dòng)畫在磁盤讀寫和網(wǎng)絡(luò)操作時(shí)變得更平滑,避免主線程被阻塞。
5.發(fā)布前禁用或盡量減少調(diào)試
如果android應(yīng)用開發(fā)周期較長,很可能在應(yīng)用中內(nèi)置了一些日志或調(diào)試代碼,在發(fā)布前確保這些功能已經(jīng)最小化或完全禁用。
6.確保UI布局簡單優(yōu)雅
簡單的屏幕不僅方便閱讀,還能加快加載速度。與其在一個(gè)單一屏幕上堆砌太多不必要的功能,不如花時(shí)間去開發(fā)優(yōu)雅的用戶界面。簡單優(yōu)雅的UI不僅能提高應(yīng)用性能,還能提高用戶使用該應(yīng)用時(shí)的效率。
7.根據(jù)目標(biāo)設(shè)備調(diào)整應(yīng)用資源
為盡可能高效地被加載,需要根據(jù)具體設(shè)備的配置調(diào)整相應(yīng)資源,尤其是圖片資源。為使應(yīng)用包文件合理適用不同設(shè)備,首先可只添加運(yùn)行該應(yīng)用需要的核心資源,然后再根據(jù)具體設(shè)備下載相關(guān)內(nèi)容。
8.使用Hierachy Viewer可視化調(diào)試工具
Hierachy Viewer能很方便地在開發(fā)者設(shè)計(jì),調(diào)試和調(diào)整界面時(shí),快速定位問題,解決問題,提高開發(fā)效率。
9.使用layoutopt進(jìn)行布局優(yōu)化
Layoutopt是一款簡單的命令行工具,可幫助找到不必要的控件嵌套以及縮減布局資源,從而使應(yīng)用變得可能“苗條”??丶缴?、布局層次越淺,性能就越好。
10.使用Traceview及其他Android工具進(jìn)行分析
Android SDK隨帶了很多用于應(yīng)用分析的工具,其中最受歡迎的是Traceview,這款圖形工具可以幫助調(diào)試和找到應(yīng)用中的性能瓶頸。
基本沒什么區(qū)別,主要是橫豎屏,分辨率的問題,平板屏幕大,平板開發(fā)更多的使用Fragment,使得屏幕能夠充分的利用。
出處:安卓巴士 ()
首先是尺寸的適配,android平板和手機(jī)相比,由于pad的大屏特性,屏幕的尺寸和分辨率的差別就很明顯,例如以下平板信息:
小米平板:4.4.4 densityDpi:320 size:1536x2048
華為平板:5.1.1 densityDpi:240 size:1200x1920
華為榮耀某平板:6.1 densityDpi:320 size:1200x1920
三星平板:6.0.1 densityDpi:320 size:1600x2560
同樣的一套mdpi下的layout或者values放在上面華為榮耀平板和三星平板上顯示差別就很大。下面是開發(fā)中關(guān)于設(shè)計(jì)的一些心得:
1.?開發(fā)中保持不增加布局層級(jí)的情況下采用百分比weight屬性;針對不同尺寸的設(shè)備百分比縮放是體驗(yàn)最完美的,但由于實(shí)際開發(fā)中復(fù)雜界面如果采用百分比,無疑增加了層級(jí)復(fù)雜度,反而降低了性能,降低了可維護(hù)性和擴(kuò)展性。
2. layout中使用的dp/sp值采用@dimen引用方式寫進(jìn)dimens.xml里面;為了方便采用多個(gè)values文件夾例如values-sw600dp,values-1280x720等針對特定屏幕適配。自然也可以采用layout-1280x720這樣的來區(qū)分不同布局,但如果只是尺寸上的適配,無疑用dimens維護(hù)幾套尺寸值是最容易的,還可以寫個(gè)讀寫文件工具,修改一個(gè)values里的dimens文件后更新到所有的values文件;
3. 以上面的華為榮耀平板為例,采用sw(smallwidth)的方式進(jìn)行適配,比較簡單的計(jì)算方式,以mdpi(160)為標(biāo)準(zhǔn),此平板的screenWidthDips = 1200/(320/160) = 600dp,所以values-sw600dp可以適配此平板(有的平板系統(tǒng)寬高是包含屏幕的虛擬按鍵的高度);
4. 為了苛求在不同尺寸平板上的體驗(yàn),采用values-1200x1920,values-1600x2560這種方式,即為每個(gè)屏幕增加尺寸適配,工作量和效率來說不會(huì)影響太大,畢竟可以通過軟件工具生成多套;
除了界面方面,平板開發(fā)上的模塊化采用Fragment更多,以及Fragment嵌套Fragment:
5. Fragment中調(diào)用startActivityForResult,如果要在Fragment的onActivityResult里回調(diào)處理,那么不要采用getActivity().startActivityForResult方法,且宿主Activity如果重寫了onActivityResult方法的,必須調(diào)用super.onActivityResult,否則Fragment的onActivityResult方法不會(huì)回調(diào),這點(diǎn)可以從Activity的源碼中看出來;
6. 嵌套在Fragment里的子Fragment的onActivityResult如果需要回調(diào)則要自己處理;
7. Fragment嵌套Fragment時(shí),在Fragment里采用getChildFragmentManager()管理子Fragment,用法跟getSupportFragmentManager()一樣;子Fragment之間的通信,可以采用事件總線方案進(jìn)行解耦,例如Otto/EventBus,但可讀性會(huì)下降,所以詳細(xì)的注釋還是必要的;