上海育創(chuàng )整理的《進(jìn)BAT公司必備的Android 開(kāi)發(fā)寶典》
好的習慣和規范不僅可以有效地提高代碼的可讀性,也可以提高工作效率,甚至對于將來(lái)接手代碼的小伙伴也是一件幸事ID嵌套樣式問(wèn)題。下面,題主通過(guò)查閱相關(guān)資料,整理出的 Andriod 開(kāi)發(fā)的一些好習慣,當然,對于其他的程序員來(lái)說(shuō),也是可以借鑒的。
一、Android編碼規范
1、 命名規范要規范,取應用包名的時(shí)候切忌取太容易重復的,如果同款手機已經(jīng)有該包名,那么會(huì )因為簽名不同而導致安裝不上,這也怪中國安卓市場(chǎng)太多,無(wú)法像Google Play那樣進(jìn)行包名審核ID嵌套樣式問(wèn)題。Google 有自己的一套命名規范(多看看 Android 系統源碼就明白了),也可以自行 Google 一下 Java (Android)命名規范,會(huì )由不少的博客介紹。
2、java代碼中不出現中文,最多注釋中可以出現中文,注釋一方面是幫助自己記憶,另一方面是團隊協(xié)作中的一個(gè)規范ID嵌套樣式問(wèn)題。好的注釋配合好的命名規范,可以省去很多溝通上的成本。
注釋至少要有如下幾方面的內容:
?。?)該接口(或類(lèi))的作用ID嵌套樣式問(wèn)題。注意寫(xiě)的應該是作用,而不是你做了什么;
?。?)參數列表的各個(gè)參數說(shuō)明;
?。?)返回值的說(shuō)明;
?。?)如果有異常拋出ID嵌套樣式問(wèn)題,對拋出異常的說(shuō)明;
?。?)如果注釋是在類(lèi)上的,留個(gè)聯(lián)系方式吧,免得以后出了問(wèn)題都找不到原作者ID嵌套樣式問(wèn)題。
3、局部變量命名、靜態(tài)成員變量命名:只能包含字母,單詞除首字母為大寫(xiě),其他字母都為小寫(xiě)ID嵌套樣式問(wèn)題。
4、常量命名:只能包含字母和_,字母全部大寫(xiě),單詞之間用_隔開(kāi)ID嵌套樣式問(wèn)題。
5、layout中的id命名:命名模式為:view縮寫(xiě)_模塊名稱(chēng)_view的邏輯名稱(chēng)
view的縮寫(xiě)詳情如下:
LinearLayout:ll
RelativeLayout:rl
TextView:tv
ImageView:iv
ImageButton:ib
Button:btn
6、activity中的view變量命名
命名模式為:view縮寫(xiě)+邏輯名稱(chēng)
建議:如果layout文件很復雜ID嵌套樣式問(wèn)題,建議將layout分成多個(gè)模塊,每個(gè)模塊定義一個(gè)moduleViewHolder,其成員變量包含所屬view
7、strings.xml中的id命名:
命名模式:activity名稱(chēng)_功能模塊名稱(chēng)_邏輯名稱(chēng) activity名稱(chēng)_邏輯名稱(chēng) common_邏輯名稱(chēng)
strings.xml中ID嵌套樣式問(wèn)題,使用activity名稱(chēng)注釋?zhuān)?將文件內容區分開(kāi)來(lái)
8、drawable中的圖片命名
命名模式:activity名稱(chēng)_邏輯名稱(chēng)/common_邏輯名稱(chēng)
9、使用layer-list和selector ID嵌套樣式問(wèn)題。
10、圖片盡量分拆成多個(gè)可重用的圖片ID嵌套樣式問(wèn)題。
11、服務(wù)端可以實(shí)現的,就不要放在客戶(hù)端ID嵌套樣式問(wèn)題。
12、引用第三方庫要慎重,避免應用大容量的第三方庫,導致客戶(hù)端包非常大ID嵌套樣式問(wèn)題。
13、處理應用全局異常和錯誤ID嵌套樣式問(wèn)題,將錯誤以郵件的形式發(fā)送給服務(wù)端
14、圖片的 .9處理ID嵌套樣式問(wèn)題。
15、使用靜態(tài)變量方式實(shí)現界面間共享要慎重ID嵌套樣式問(wèn)題。
16、Log(系統名稱(chēng) 模塊名稱(chēng) 接口名稱(chēng),詳細描述)ID嵌套樣式問(wèn)題。
17、單元測試(邏輯測試、界面測試)ID嵌套樣式問(wèn)題。
18、不要重用父類(lèi)的handler,對應一個(gè)類(lèi)的handler也不應該讓其子類(lèi)用到,否則會(huì )導致message.what沖突ID嵌套樣式問(wèn)題。
19、activity中在一個(gè)View.OnClickListener中處理所有的邏輯ID嵌套樣式問(wèn)題。
20、strings.xml中使用%1$s實(shí)現字符串的通配ID嵌套樣式問(wèn)題。
21、styles.xml:將layout中不斷重現的style提煉出通用的style通用組件,放到styles.xml中ID嵌套樣式問(wèn)題。
22、如果多個(gè)Activity中包含共同的UI處理,那么可以提煉一個(gè)CommonActivity,把通用部分叫由它來(lái)處理,其他activity只要繼承它即可ID嵌套樣式問(wèn)題。
23、使用button+activitgroup實(shí)現tab效果時(shí),使用Button.setSelected(true),確保按鈕處于選擇狀態(tài),并使activitygroup的當前activity與該button對應ID嵌套樣式問(wèn)題。
24、如果所開(kāi)發(fā)的為通用組件,為避免沖突,將drawable/layout/menu/values目錄下的文件名增加前綴ID嵌套樣式問(wèn)題。
25、數據一定要效驗ID嵌套樣式問(wèn)題,例如:
字符型轉數字型ID嵌套樣式問(wèn)題,如果轉換失敗一定要有缺省值;
服務(wù)端響應數據是否有效判斷ID嵌套樣式問(wèn)題。
26、版本控制ID嵌套樣式問(wèn)題。就算是自己一個(gè)人寫(xiě)代碼,版本控制也是有必要的,Git 也好,SVN 也好,都是有幫助的。版本控制一方面是對自己代碼的一個(gè)備份,另一方面,如果想回返回歷史版本也是極有幫助的,所以最好能夠熟悉一下 Git 或者 SVN 的使用。
27、制作名詞表ID嵌套樣式問(wèn)題。Android 是圍繞四大組件特別是 Activity 和 Service 進(jìn)行開(kāi)發(fā)的,但是如果項目龐大,有多個(gè) Activity 存在,那么記住每一個(gè) Activity 的類(lèi)名是很難得,但是記住每一個(gè) Activity 的功能卻相對容易。這時(shí)名詞表派上用場(chǎng)了,記錄每一個(gè)模塊、組件、甚至是每一個(gè) Activity 的官方統一名稱(chēng)(比如,功能是作品列表的 Activity,名稱(chēng)就叫作品列表頁(yè),對應的類(lèi)是 WorksListActivity),在溝通過(guò)程中,大家(包括測試人員等項目相關(guān)人員)統一說(shuō)“作品列表頁(yè)”。當時(shí)的初衷是解決測試團隊的Bug 描述過(guò)于模糊(如果有多個(gè)列表頁(yè),測試人員往往會(huì )寫(xiě)“列表頁(yè)XXX問(wèn)題”)。
28、內存管理ID嵌套樣式問(wèn)題。Android 雖然延續了 Java 的垃圾回收機制,但是并不意味 Android 應用程序就不會(huì )出現內存問(wèn)題。在 Android 中引起內存開(kāi)銷(xiāo)過(guò)大的往往是 BitMap 對象。BitMap.java實(shí)際上是 Skia 引擎中對圖片處理部分的 Java 層代碼而已(真正工作的是 C++層代碼,通過(guò) JNI 封裝,最后提供 Java 層的接口),那么你創(chuàng )建 BitMap 對象實(shí)際上是創(chuàng )建了兩部分內存,一部分是 Java 層的,就是 BitMap對象,Java 的垃圾回收會(huì )在合適的時(shí)機回收這一部分內存。另一部分是 C++層面的,也就是通過(guò) JNI 調用 C++層的代碼分配的那一部分內存。Java 的垃圾回收是不會(huì )回收這一部分內存的,所以如果不手動(dòng)釋放的話(huà)就容易引起內存問(wèn)題。
二、Android性能優(yōu)化
1、嵌套樣式問(wèn)題,設置連接超時(shí)時(shí)間和響應超時(shí)時(shí)間
嵌套樣式問(wèn)題。
2、istview 性能優(yōu)化
?。?)復用convertView
在getItemView中,判斷convertView是否為空,如果不為空,可復用ID嵌套樣式問(wèn)題。如果couvertview中的view需要添加listerner,代碼一定要在if(convertView==null){}之外。
?。?)異步加載圖片
item中如果包含有webimageID嵌套樣式問(wèn)題,那么最好異步加載
?。?)快速滑動(dòng)時(shí)不顯示圖片
當快速滑動(dòng)列表時(shí)(SCROLL_STATE_FLING),item中的圖片或獲取需要消耗資源的view,可以不顯示出來(lái);而處于其他兩種狀態(tài)(SCROLL_STATE_IDLE 和SCROLL_STATE_TOUCH_SCROLL),則將那些view顯示出來(lái)ID嵌套樣式問(wèn)題。
3.使用線(xiàn)程池ID嵌套樣式問(wèn)題。分為核心線(xiàn)程池和普通線(xiàn)程池,下載圖片等耗時(shí)任務(wù)放置在普通線(xiàn)程池,避免耗時(shí)任務(wù)阻塞線(xiàn)程池后,導致所有異步任務(wù)都必須等待。
4.異步任務(wù),分為核心任務(wù)和普通任務(wù),只有核心任務(wù)中出現的系統級錯誤才會(huì )報錯,異步任務(wù)的ui操作需要判斷原activity是否處于激活狀態(tài)ID嵌套樣式問(wèn)題。
5.盡量避免static成員變量引用資源耗費過(guò)多的實(shí)例,比如Context ID嵌套樣式問(wèn)題。
6.使用WeakReference代替強引用,弱引用可以讓您保持對對象的引用,同時(shí)允許GC在必要時(shí)釋放對象,回收內存ID嵌套樣式問(wèn)題。對于那些創(chuàng )建便宜但耗費大量?jì)却娴膶ο?,?即希望保持該對象,又要在應用程序需要時(shí)使用,同時(shí)希望GC必要時(shí)回收時(shí),可以考慮使用弱引用。
7.超級大胖子Bitmap,及時(shí)的銷(xiāo)毀(Activity的onDestroy時(shí),將bitmap回收),設置一定的采樣率,巧妙的運用軟引用drawable對應resid的資源,bitmap對應其他資源ID嵌套樣式問(wèn)題。
8.保證Cursor 占用的內存被及時(shí)的釋放掉,而不是等待GC來(lái)處理ID嵌套樣式問(wèn)題。并且 Android明顯是傾向于編程者手動(dòng)的將Cursor close掉。
9.線(xiàn)程也是造成內存泄露的一個(gè)重要的源頭ID嵌套樣式問(wèn)題。線(xiàn)程產(chǎn)生內存泄露的主要原因在于線(xiàn)程生命周期的不可控。
10.如果ImageView的圖片是來(lái)自網(wǎng)絡(luò ),進(jìn)行異步加載ID嵌套樣式問(wèn)題。
11.應用開(kāi)發(fā)中自定義View的時(shí)候,交互部分,千萬(wàn)不要寫(xiě)成線(xiàn)程不斷刷新界面顯示,而是根據TouchListener事件主動(dòng)觸發(fā)界面的更新ID嵌套樣式問(wèn)題。
12、優(yōu)化網(wǎng)絡(luò )ID嵌套樣式問(wèn)題。如果沒(méi)有網(wǎng)絡(luò )連接,請讓你的應用跳過(guò)網(wǎng)絡(luò )操作;只在有網(wǎng)絡(luò )連接并且無(wú)漫游的情況下更新數據。
13、選擇兼容的數據格式,把含有文本數據和二進(jìn)制數據的請求全部轉化成二進(jìn)制數據格式請求ID嵌套樣式問(wèn)題。
14、使用高效的轉換工具,多考慮使用流式轉換工具,少用樹(shù)形的轉換工具ID嵌套樣式問(wèn)題。
15、為了更快的用戶(hù)體驗,請減少重復訪(fǎng)問(wèn)服務(wù)器的操作ID嵌套樣式問(wèn)題。如果可以的話(huà),請使用framework的GZIP庫來(lái)壓縮文本數據以高效使用CPU資源。
16、優(yōu)化應用在前端的工作
?。?)如果考慮使用wakelocks,盡量設置為最小的級別ID嵌套樣式問(wèn)題。
?。?)為了防止潛在的bug導致的電量消耗ID嵌套樣式問(wèn)題,請明確指定超時(shí)時(shí)間;
?。?)啟用 android:keepScreenOn屬性ID嵌套樣式問(wèn)題。
?。?)除了系統的GC操作,多考慮手動(dòng)回收Java對象,比如XmlPullParserFactory和BitmapFactoryID嵌套樣式問(wèn)題。還有正則表達式的Matcher.reset(newString)操作、StringBuilder.setLength(0)操作。
?。?)要注意同步的問(wèn)題,盡管在主線(xiàn)程中是安全的ID嵌套樣式問(wèn)題。
?。?)在Listview中要多采用重復利用策略ID嵌套樣式問(wèn)題。
?。?)如果允許的話(huà)多使用粗略的網(wǎng)絡(luò )定位而不用GPS,對比一下GPS需要1mAh(25s * 140 mA),而一般網(wǎng)絡(luò )只用0.1mAh(2s * 180mA)ID嵌套樣式問(wèn)題。
?。?)確保注銷(xiāo)GPS的位置更新操作,因為這個(gè)更新操作在onPause()中也是會(huì )繼續的ID嵌套樣式問(wèn)題。當所有的應用都注銷(xiāo)了這個(gè)操作,用戶(hù)可以在系統設置中重新啟用GPS而不浪費電量。
?。?0)請考慮在大量數理運算中使用低精度變量并在用DisplayMetrics進(jìn)行DPI任務(wù)時(shí)緩存變量值ID嵌套樣式問(wèn)題。
17、優(yōu)化工作在前臺的應用
?。?)請確保service生命周期都是短暫的ID嵌套樣式問(wèn)題,因為每個(gè)進(jìn)程都需要2MB的內存,而在前臺程(2)序需要內存時(shí)也會(huì )重新啟動(dòng);
?。?)保持內存的使用量不要太大;
?。?)如果要應用每30分鐘更新一次ID嵌套樣式問(wèn)題,請在設備處于喚醒狀態(tài)下進(jìn)行;
?。?)Service在pull或者sleep狀態(tài)都是不好的ID嵌套樣式問(wèn)題,這就是為什么在服務(wù)結束時(shí)要使用.
?。?)AlarmManager或者配置屬性stopSelf()的原因ID嵌套樣式問(wèn)題。
18、電池其它注意事項
?。?)在進(jìn)行整體更新之前檢查電池的狀態(tài)和網(wǎng)絡(luò )狀態(tài)ID嵌套樣式問(wèn)題,等待最好的狀態(tài)再進(jìn)行大幅度裝換操作;
?。?)讓用戶(hù)看到用電情況ID嵌套樣式問(wèn)題,比如更新周期,后臺操作的時(shí)候;
19、怎么找到布局顯示問(wèn)題ID嵌套樣式問(wèn)題?
當我們?yōu)椴季謫为殑?chuàng )建UI的時(shí)候,就是在創(chuàng )建濫用內存的App,它在UI中會(huì )出現可惡的延時(shí)ID嵌套樣式問(wèn)題。要實(shí)現一個(gè)流暢的、低內存占用的UI,第一步就是搜索你的應用找出潛在的瓶頸布局。使用Android SDK/tools/中自帶的Hierarchy Viewer Tool工具。還有一個(gè)很好的工具就是Lint,它會(huì )掃描應用的源碼去尋找可能存在的bug,并為控件結果進(jìn)行優(yōu)化。
10、解決問(wèn)題ID嵌套樣式問(wèn)題。如果布局顯示結果發(fā)現了問(wèn)題,你可以考慮簡(jiǎn)化布局結構。可以把LinearLayout類(lèi)型轉化成RelativeLayout類(lèi)型,降低布局的層級結構。
三、Android UI優(yōu)化
1、layout組件化,盡量使用merge及include復用ID嵌套樣式問(wèn)題。
2、使用styles,復用樣式定義ID嵌套樣式問(wèn)題。
3、軟鍵盤(pán)的彈出控制,不要讓其覆蓋輸入框ID嵌套樣式問(wèn)題。
4、數字、字母和漢字混排占位問(wèn)題:將數字和字母全角化ID嵌套樣式問(wèn)題。由于現在大多數情況下我們的輸入都是半角,所以 字母和數字的占位無(wú)法確定,但是一旦全角化之后,數字、字母的占位就和一個(gè)漢字的占位相同了,這樣就可以避免由于占位導致的排版問(wèn)題。
5、英文文檔排版:textview自動(dòng)換行時(shí)要保持單詞的完整性,解決方案是計算字符串長(cháng)度,然后手動(dòng)設定每一行顯示多少個(gè)字母并加上‘n’ID嵌套樣式問(wèn)題。
6、復雜布局使用RelativeLayout ID嵌套樣式問(wèn)題。
7、自適應屏幕,使用dp替代pix ID嵌套樣式問(wèn)題。
8、使用android:layout_weight或者TableLayout制作等分布局ID嵌套樣式問(wèn)題。
9、使用animation-list制作動(dòng)畫(huà)效果ID嵌套樣式問(wèn)題。
10、千萬(wàn)不要阻塞用戶(hù)主線(xiàn)程ID嵌套樣式問(wèn)題。用戶(hù)主線(xiàn)程就是 UI 線(xiàn)程,主要負責 UI 的繪制(除 SurfaceView 外,其他 View 對象都是需要在 UI 線(xiàn)程中進(jìn)程操作的)。為了保證 App 的交互盡可能的流程,請不要在 UI 線(xiàn)程中進(jìn)行耗時(shí)操作(文件讀寫(xiě)、秒)。
四、給Android開(kāi)發(fā)工程師的建議
021yin.com /book/zh/v2
2、勤做總結,推薦使用印象筆記,把一些懂的經(jīng)驗總結起來(lái),把還不懂的文章掛里面,有時(shí)間就慢慢消化ID嵌套樣式問(wèn)題。
3、定期code review,不斷迭代,你總會(huì )發(fā)現一些不合理的代碼,或者需要優(yōu)化的地方ID嵌套樣式問(wèn)題。
021yin.com ,stormzhang,但總歸來(lái)說(shuō),去Android官網(wǎng)或者參考一份Java API文檔雖說(shuō)枯燥,但熟悉之后,你會(huì )有更大的進(jìn)步ID嵌套樣式問(wèn)題。另外,善用 Google 。
021yin.com/u/levi/p/imouto-host/git
5、如想更深入了解可閱讀珍藏許久的文章《Android應用程序開(kāi)發(fā)以及背后的設計思想深度剖析》ID嵌套樣式問(wèn)題。
6、如果你公司沒(méi)有強大的測試團隊,發(fā)布應用前最好把應用放到測試平臺去測測,比如云測之類(lèi)的ID嵌套樣式問(wèn)題。
7、不要重復制造輪子ID嵌套樣式問(wèn)題。這個(gè)適用于代碼層面以及業(yè)務(wù)層面。
四、應用層的開(kāi)發(fā)
1、寫(xiě)代碼前先在本子上畫(huà)好大概的模塊圖,類(lèi)圖,能和同事討論下最好ID嵌套樣式問(wèn)題。
2、使用開(kāi)源代碼務(wù)必搞懂主要實(shí)現方式,以便填坑ID嵌套樣式問(wèn)題。
3、應用內的資源要統一管理,如線(xiàn)程,緩存,網(wǎng)絡(luò ),數據庫,配置,設備事件監聽(tīng)等等,以便性能分析和維護ID嵌套樣式問(wèn)題。
4、合理使用設計模式,做好UI之間,和業(yè)務(wù)以及數據層的解耦非常必要,以便應付產(chǎn)品汪(褒義詞)的各種變化ID嵌套樣式問(wèn)題。
5、不要總是TODO,因為翔留下就留下了,還得寫(xiě)新的翔,等后來(lái)的童鞋來(lái)收拾,被人罵罵也不好ID嵌套樣式問(wèn)題。
6、沒(méi)事多看下Github,Android程序基本可以用一個(gè)個(gè)開(kāi)源庫搭積木搞出來(lái),當然業(yè)務(wù)除外ID嵌套樣式問(wèn)題。也可以看看其他平臺的庫和各種框架,不要把自己局限在A(yíng)ndroid上。
7、代碼風(fēng)格團隊要統一ID嵌套樣式問(wèn)題。
8、提高基本素質(zhì),做程序員,而不是Android程序員ID嵌套樣式問(wèn)題。
9、使用StrictMode來(lái)檢查UI線(xiàn)程中可能潛在的費時(shí)操作ID嵌套樣式問(wèn)題。
10、使用一些特殊的工具如Systrace或者Traceview來(lái)尋找在你的應用中的瓶頸ID嵌套樣式問(wèn)題。
11、用進(jìn)度條向用戶(hù)展示操作進(jìn)度ID嵌套樣式問(wèn)題。
12、如果初始化操作很費時(shí),請展示一個(gè)歡迎界面ID嵌套樣式問(wèn)題。
13、優(yōu)化設備的電池壽命ID嵌套樣式問(wèn)題。如果應用很費電,請不要責怪用戶(hù)卸載了你的應用。對于電池使用來(lái)說(shuō),主要費電情況如下:
?。?)更新數據時(shí)經(jīng)常喚醒程序;
?。?)用EDGE或者3G來(lái)傳遞數據;
?。?)文本數據轉換,進(jìn)行非JIT正則表達式操作ID嵌套樣式問(wèn)題。
五、其他的一些 Android 開(kāi)發(fā)建議:
1、嚴格把控生命周期(Activity、Service、ContentProvider 等)ID嵌套樣式問(wèn)題。在每一個(gè)生命周期事件中,明確應該做什么不應該做什么是很有必要的,不然也會(huì )容易造成各種莫名其妙的問(wèn)題(比如 onCreate 中使用了 onResume 中才初始化的對象)。
2、在使用 XML 文件進(jìn)行 UI 布局時(shí),應該盡量減少 Layout 的嵌套層級ID嵌套樣式問(wèn)題。Layout 的過(guò)度嵌套會(huì )造成渲染時(shí)資源開(kāi)銷(xiāo)過(guò)大的問(wèn)題。
PS: XML 也是代碼ID嵌套樣式問(wèn)題,注意維護好 XML 的可讀性!
3、資源文件的使用,資源文件包括圖片、字符串、尺寸、顏色等等ID嵌套樣式問(wèn)題。在使用尺寸資源的時(shí)候應該盡量使用像素無(wú)關(guān)的單位,比如 dp 和 sp。而字符串資源(比如 Button 上顯示的名稱(chēng))也應該盡可能的抽離出來(lái),使用 res/value 下的xml 文件進(jìn)行維護。一方面方便日后管理,另一方面方便國際化。
4、多線(xiàn)程以及線(xiàn)程池的使用ID嵌套樣式問(wèn)題。前面說(shuō)過(guò)應該盡量避免在主線(xiàn)程中執行耗時(shí)操作,那么多線(xiàn)程就變得很有必要。對于 Java 來(lái)說(shuō),線(xiàn)程的創(chuàng )建與銷(xiāo)毀是非常占用資源的,線(xiàn)程的濫用(隨手 new Thread 等)會(huì )造成 App 整體性能的下降。Java 提供了Executors的線(xiàn)程池方案,而 Android 自身也提供了AsyncTask 這樣的異步任務(wù)方案(實(shí)際上也是線(xiàn)程池)。
5、Java 的權限控制機制ID嵌套樣式問(wèn)題。Java提供了public, private, protected 三個(gè)訪(fǎng)問(wèn)權限修飾詞,提供了以下四種訪(fǎng)問(wèn)權限控制機制:
?。?)包訪(fǎng)問(wèn)權限;
?。?)Public訪(fǎng)問(wèn)權限;
?。?)Private訪(fǎng)問(wèn)權限;
?。?)Protected訪(fǎng)問(wèn)權限;
訪(fǎng)問(wèn)權限的合理使用可以有效地隱藏實(shí)現,避免將不必要的數據或接口暴露出來(lái)ID嵌套樣式問(wèn)題。
6、 final 和 static 關(guān)鍵字的合理使用ID嵌套樣式問(wèn)題。很多人覺(jué)得這是很基礎的東西,但是 final 和 static 關(guān)鍵字的合理使用能夠有效提升代碼的執行效率,而不合理使用則后患無(wú)窮。
7、 Android 設備的內存資源是極度珍貴的,合理的使用、回收內存也是一種好的編程習慣ID嵌套樣式問(wèn)題。Java 對象的引用類(lèi)型會(huì )影響到垃圾回收對象的時(shí)機。Java 有強引用、 軟引用、 弱引用、虛引用,以及 Android 增加的 Lru 內存管理。建議題主了解一下這四種引用類(lèi)型的特點(diǎn)以及 Lru 內存管理的具體實(shí)現。
8、 接口和抽象類(lèi)ID嵌套樣式問(wèn)題。這是老生常談的話(huà)題了,但卻是永恒的話(huà)題。接口和抽象類(lèi)的合理使用,可以增加代碼的可維護性和擴展性。接口和抽象類(lèi)也是各種設計模式的基石。
9、軟件設計的六大設計原則ID嵌套樣式問(wèn)題,即
?。?)針對接口編程ID嵌套樣式問(wèn)題,不針對實(shí)現編程
?。?)單一職責原則
?。?)開(kāi)放封閉原則
?。?)里氏代換原則
?。?)迪米特法則
?。?)合成聚合復用原則
10、統一項目的編碼格式(推薦使用 UTF-8)ID嵌套樣式問(wèn)題。如果多人協(xié)作,這種舉措顯得尤為重要。由此引申出來(lái)的另外一個(gè)規范就是,規范統一命名風(fēng)格,即團隊中使用相同的命名風(fēng)格。
11、TextView(往往 TextView 派生子類(lèi)同樣適用)調用 setText 方法設置一個(gè) int 型的數據ID嵌套樣式問(wèn)題,千萬(wàn)要將該值轉為 String,否則在某些設備中它會(huì )默認去查詢(xún) R 文件中定義的資源
12、使用友盟分享 SDK,需要執行分享的 Activity 請不要為該 Activity 設置android:process屬性ID嵌套樣式問(wèn)題。比如你的 App 運行在 com.codingfish.test 進(jìn)程,需要產(chǎn)生分享動(dòng)作的Activity 設置 android:proces=":com.codingfish.hello" ,那么新浪微博就會(huì )出現你設置的分享內容沒(méi)有顯示的問(wèn)題。該 Bug 已經(jīng)提交給友盟的技術(shù)人員,但是很久沒(méi)有得到修復。
13、上線(xiàn)之前一定要使用正式簽名打包ID嵌套樣式問(wèn)題。某朋友公司 Android 的應用上架之前,負責打包上線(xiàn)的童鞋(新人,老人已離職,只有這一個(gè)Android)沒(méi)有簽名的概念,直接將 Debug 簽名的 Apk 投放到渠道了,到現在還有一批設備沒(méi)有替換回來(lái)。
14、在 Activity 中盡可能少的創(chuàng )建 Handler 對象,創(chuàng )建一個(gè)主線(xiàn)程 Handler,一個(gè)后臺 HandlerThread 就可以了ID嵌套樣式問(wèn)題。
15、使用線(xiàn)程的地方盡量不要 new Thread,而是使用 AsyncThread ID嵌套樣式問(wèn)題。
16、 onCreate(Bundle savedInstanceState) 切記將super.onCreate(savedInstanceState);放在一切業(yè)務(wù)的前面ID嵌套樣式問(wèn)題。
17、 創(chuàng )建了四大組件一定記得要在 AndroidManifest 文件中聲明(當然 BroadcastReceiver 可以動(dòng)態(tài)注冊)ID嵌套樣式問(wèn)題。
18、 為Activity聲明系統配置變更事件 系統配置變更事件是指轉屏,區域語(yǔ)言發(fā)生變化,屏幕尺寸發(fā)生變化等等,如果Activity沒(méi)有聲明處理這些事件,發(fā)生事件時(shí),系統會(huì )把Activity殺掉然后重啟,并嘗試恢復狀態(tài),Activity有機會(huì )通過(guò)onSaveInstanceState()保存一些基本數據到Bundle中,然后此Bundle會(huì )在A(yíng)ctivity的onCreate()中傳遞過(guò)去ID嵌套樣式問(wèn)題。雖然這貌似正常,但是這會(huì )引發(fā)問(wèn)題,因為很多其他的東西比如Dialog等是要依賴(lài)于具體Activity實(shí)例的。所以這種系統默認行為通常都不是我們想要的。
為了避免這些系統默認行為ID嵌套樣式問(wèn)題,就需要為Activity聲明這些配置,如下二個(gè)是每個(gè)Activity必須聲明的:
activity android:configChanges="orientation|keyboardHidden"
幾乎所有的Activity都要聲明如上ID嵌套樣式問(wèn)題,為什么Android不把它們變成Default的呢?
19、 盡量使用Android的API 這好像是廢話(huà)ID嵌套樣式問(wèn)題,在A(yíng)ndroid上面開(kāi)發(fā)不用Android API用什么?因為Android幾乎支持Java SE所有的API,所以有很多地方Android API與Java SE的API會(huì )有重復的地方,比如說(shuō)對于文件的操作最好使用Android里面Context封裝的API,而不要直接使用File對象:
Context.openFileOutput(String); // no File file = new File(String)
原因就是API里面會(huì )考慮到Android平臺本身的特性;再如,少用Thread,而多使用AsyncTask等ID嵌套樣式問(wèn)題。
20、 要考慮到Activity和進(jìn)程被殺掉的情況 如了通常情況退出Activity外,還有Activity因其他原因被殺的情況,比如系統內存過(guò)低,系統配置變更,有異常等等,要考慮和測試這種情況,特別是Activity處理重要的數據時(shí),做好的數據的保存ID嵌套樣式問(wèn)題。
21、語(yǔ)言要簡(jiǎn)潔ID嵌套樣式問(wèn)題。有些語(yǔ)言真的很啰嗦,中文或英文很簡(jiǎn)短就能表達的事情到了其他語(yǔ)言就變的死長(cháng)死長(cháng)的,所以如果是wrap_content就可能把其他控制擠出可視范圍; 如果是指定長(cháng)度就可能顯示不全。也要注意特殊語(yǔ)言比如那些從右向左讀的語(yǔ)言。
PS:有代碼潔癖的,很注重代碼質(zhì)量的程序員,可以詳盡閱讀 SonarQube 關(guān)于JAVA編碼的規則:Sonar@OSC - 代碼質(zhì)量分析平臺,如果條件允許,自己配置一下,每周通過(guò)Sonar運行一下自己的代碼,以提高代碼質(zhì)量ID嵌套樣式問(wèn)題。
22、不要用四大組件去實(shí)現接口ID嵌套樣式問(wèn)題。一是組件的對象都比較大,實(shí)現接口比較浪費,而且讓代碼更不易讀和理解;另外更重要的是導致多方引用,可能會(huì )引發(fā)內存泄露。
23、 用getApplication()來(lái)取Context當參數 對于需要使用Context對象作為參數的函數,要使用getApplication()獲取Context對象當參數,而不要使用this,除非你需要特定的組件實(shí)例!getApplication()返回的Context是屬于A(yíng)pplication的,它會(huì )在整個(gè)應用的生命周期內存在,遠大于某個(gè)組件的生命周期,所以即使某個(gè)引用長(cháng)期持有Context對象也不會(huì )引發(fā)內存泄露ID嵌套樣式問(wèn)題。
24、主線(xiàn)程只做UI控制和Frameworks回調相關(guān)的事ID嵌套樣式問(wèn)題。附屬線(xiàn)程只做費時(shí)的后臺操作。交互只通過(guò)Handler。這樣就可以避免大量的線(xiàn)程問(wèn)題。
25、Frameworks的回調不要做太多事情僅做必要的初始化,其他不是很重要的事情可以放到其他線(xiàn)程中去做,或者用Handler Schedule到稍后再做ID嵌套樣式問(wèn)題。
26、要考慮多分辨率 至少為hdpi, mdpi, ldpi準備圖片和布局ID嵌套樣式問(wèn)題。元素的單位也盡可能的使用dip而不要用px。
27、利用Android手機的硬鍵 幾乎所有的Android手機都有BACK和MENU,它們的作用是返回和彈出菜單,所以就不要再在UI中設計返回按扭和菜單按扭ID嵌套樣式問(wèn)題。很多優(yōu)秀的應用如隨手記和微信都有返回鍵,他們之所以有是因為他們都是從iOS上移植過(guò)來(lái)的,為了保存體驗的一致,所以也有了返回和菜單。但這不夠Android化,一個(gè)純正的Android是沒(méi)有必須重復硬鍵的功能的。
PS:多看看官方的 APIDEMO,多讀一下Android 上的內容ID嵌套樣式問(wèn)題。
28、如果你的IDE是EclipseID嵌套樣式問(wèn)題,用好這幾個(gè)快捷鍵,爽歪歪哦:
?。?)CTRL + SHIFT + O
?。?)ALT + SHIFT + M
?。?)ALT + SHIFT + S
?。?)CTRL + O
?。?)CTRL + /
?。?)ALT + /
?。?)CTRL + D
?。?)CTRL + K
?。?)ALT + → 和 ALT + 左箭頭
?。?0)CTRL + SHIFT + X 和 CTRL + SHIFT + Y
?。?1)F5、F6、F7、F8
?。?2)F11
?。?3)CTRL + M
六、程序員的工作習慣
1、一定要寫(xiě)筆記ID嵌套樣式問(wèn)題。你可以不寫(xiě)博客,但是一定要有筆記。好記性不如爛筆頭。當然對于程序員來(lái)說(shuō),一個(gè)電子的筆記遠遠好與紙質(zhì)的筆記。
2、寫(xiě)博客ID嵌套樣式問(wèn)題。博客是附帶品.但是你只有去寫(xiě)博客了,才知道別人的博客是怎么寫(xiě)出來(lái)了。博客也是你和別人交流技術(shù)的東西.別人可以從你文章中學(xué)習東西,你可以與別人交流.
PS:調查發(fā)現,寫(xiě)博客的程序員工資要搞那么5000+ID嵌套樣式問(wèn)題。
3、盡量閱讀英文文檔,而不是有問(wèn)題就百度.有問(wèn)題問(wèn)Strack Overflow ID嵌套樣式問(wèn)題。
4、不要等別人告訴你這東西怎么用,那東西怎么學(xué),只有自己去提前研究了,你才能更勝一籌ID嵌套樣式問(wèn)題。
5、保持不斷學(xué)習ID嵌套樣式問(wèn)題。
文/漫步、張明云、captain(知乎作者)