1伯襟、layout的命名方式:(盡量帶上模塊名)
Activity的layout以module_activity開頭
Fragment的layout以module_fragment開頭
Dialog的layout以module_dialog開頭
include的layout以module_include開頭
ListView的item layout以module_list_item開頭
RecyclerView的item layout以module_recycle_item開頭
GridView的item layout以module_grid_item開頭
2先较、資源文件的命名:
①drawable資源文件的命名:(以小寫單詞隘道,下劃線的方式命名),根據(jù)分辨率的不同,存放到不同的drawable的目錄下,建議只使用一套,例如drawable-xhdpi.
模塊名業(yè)務(wù)功能描述控件描述控件狀態(tài)限定詞
module_login_btn_pressed
②anim資源名稱以小寫單詞+下劃線的方式命名:模塊名邏輯名稱[方向][序號]
module_fade_in module_fade_out
③color資源使用#AARRGGBB格式,模塊名邏輯名稱_顏色
<color name="module_btn_bg_color">#33b5e5e5</color>
④id資源原則上用駝峰法命名,View組件的資源id需要以View的縮寫作為前綴,LinearLayout(ll),RelativeLayout(rl),ConstraintLayout(cl),ListView(lv),ScrollView(sv),TextView(tv),Button(btn),ImageView(iv),CheckBox(cb),RadioButton(rb),EditText(et),ProgressBar(progress_bar),DatePicker(date_picker)
⑤大分辨率(單位度超過1000)的大分辨率圖片建議統(tǒng)一放在xxhdpi目錄下管理,否則將導(dǎo)致占用內(nèi)存成倍數(shù)增加灌曙。
三救崔、Android基本組件(Activity,Service,BroadcastReceiver,ContentProvider,Fragment)
①Activity中的onSaveInstanceState()方法不是Activity的生命周期戈轿,其在典型的Activity的生命周期的方法中是不會被調(diào)用的,但是當Activity意外銷毀(切換屏幕的時候)决摧,調(diào)用onSaveInstanceState來保存UI的狀態(tài),只能用于保存臨時數(shù)據(jù)。持久化存儲應(yīng)該在Activity的onPause/onStop()中來實行掌桩。
②Activity間通過隱式Intent的跳轉(zhuǎn),在發(fā)出Intent之前必須通過resolveActivity檢查,避免找不到合適的調(diào)用組件边锁,造成ActivityNotFoundException.
③避免在Service的onStartCommand()/onBind()方法中執(zhí)行耗時的操作,可以改成在IntentService的handleIntent或者其他異步機制來完成拘鞋。
④總是適用顯示Intent啟動或者綁定Service,且不要為服務(wù)生命Intent Filter,保證應(yīng)用的安全性,如果確實使用隱式調(diào)用,則可為Service提供Intent Filter并從Intent中排除相應(yīng)的組件名稱砚蓬,但是必須搭配使用Intent的setPackage()方法設(shè)置Intent的指定包名,這樣可以充分消除目標服務(wù)的不確定性。
⑤當前Activity的onPause方法執(zhí)行結(jié)束后才會執(zhí)行下一個Activity的onCreate,所以在onPause方法中不適合做耗時較長的工作盆色,這樣會影響頁面之間的跳轉(zhuǎn)效率灰蛙。
⑥Activity或者Fragment中動態(tài)注冊BroadCastReceiver時,registerReceiver()和unregisterReceiver()要成對出現(xiàn),如果不成對出現(xiàn),則可能導(dǎo)致已經(jīng)注冊的receiver沒有在合適的時機注銷,導(dǎo)致內(nèi)存泄漏,占用內(nèi)存空間,加重SystemService負擔。
四隔躲、UI與布局:(measure,layout,draw)
①布局中不得使用ViewGroup多重嵌套,盡量不要使用LinearLayout嵌套,應(yīng)該改為RelativeLayout,可以有效降低嵌套數(shù),保持扁平的View結(jié)構(gòu)摩梧。
②在Activity中顯示對話框或彈出浮層時,盡量使用DialogFragment,而非Dialog/AlertDialog,這樣便于隨Activity生命周期管理對話框/彈出浮層的生命周期。
③文本大小使用單位sp,view使用單位dp,對于TextView,如果在文字大小確定的情況下,推薦使用wrap_content布局避免出現(xiàn)文字顯示不全的適配問題宣旱。
④不能在Activity沒有完全顯示PopupWindow和Dialog
⑤盡量不要使用AnimationDrawable,它在初始化的時候就將所有的圖片加載到內(nèi)存中仅父,特備占內(nèi)存,并且還不能釋放,釋放之后下次進入再次加載時會報錯浑吟。
⑥不能使用ScrollView包裹ListView/GridView/ExpandableListView,因為這樣會把ListView的所有的Item都加載到內(nèi)存中笙纤,要消耗巨大的內(nèi)存和cpu去繪制圖面。
五组力、進程省容、線程與消息通信:
①新建線程的時候,必須通過線程池提供(AsybcTask或者ThreadPoolExecutor或者其他形式自定義的線程池)燎字,不允許在應(yīng)用中自定義顯示創(chuàng)建線程腥椒。(使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時間以及系統(tǒng)資源的開銷,解決資源不足的問題候衍。如果不適用線程池笼蛛,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者"過度切換"的問題,另外創(chuàng)建匿名線程不便于后續(xù)的資源使用分析蛉鹿,對性能分析造成困擾滨砍。
②子線程中不能更新界面,更新界面必須在主線程中進行,網(wǎng)絡(luò)操作不能在主線程中調(diào)用。
六妖异、文件與數(shù)據(jù)庫
①任何時候不要硬編碼文件路徑惨好,Android應(yīng)用模塊提供內(nèi)部和外部存儲,分別用于存放應(yīng)用自身數(shù)據(jù)以及應(yīng)用產(chǎn)生的用戶數(shù)據(jù)。
②SharedPreference提交數(shù)據(jù)時随闺,盡量使用Editor.apply(),而非Editor.commit。一般來講蔓腐,僅當需要確定提交結(jié)果矩乐,并據(jù)此有后續(xù)操作的時候,才使用Editor.commit。(SharedPreference相關(guān)修改使用apply方法進行提交會先寫入內(nèi)存,然后再異步寫入磁盤散罕,commit方法是直接寫入磁盤,如果操作頻繁的話分歇,apply的性能會優(yōu)于commit.
七、Bitmap欧漱、Drawable與動畫
①加載大圖片或者一次性加載多張圖片的時候,應(yīng)該在異步線程中進行(繼承自AsyncTask,在doInBackground的方法中執(zhí)行圖片加載),因為圖片的加載涉及到IO的操作,以及CPU的密集操作,很可能引起卡頓职抡。
②使用完圖片時,應(yīng)該釋放內(nèi)存。(如:bitmap.recycle();)
③頁面退出或者暫停的情況下,及時清理動畫內(nèi)存資源误甚。(mImageView.clearAnimation())
④在動畫或者其他異步任務(wù)結(jié)束時,應(yīng)該考慮回調(diào)時刻的環(huán)境是否還支持業(yè)務(wù)處理,例如Activity的onStop()函數(shù)已經(jīng)執(zhí)行,且在該函數(shù)中主動釋放了資源,此時回調(diào)如果不做判斷就會產(chǎn)生空指針崩潰缚甩。
⑤盡量減少Bitmap(BitmapDrawable)的使用,盡量使用純色(ColorDrawable),漸變色(GradientDrawable),StateSelector(StateListDrawable)等與Shape結(jié)合的形式構(gòu)建繪圖。
八窑邦、安全:
①使用PendingIntent時,禁止使用空Intent,同時禁止使用隱式Intent,因為使用了空Intent會導(dǎo)致惡意用戶劫持修改Intent的內(nèi)容擅威。禁止使用一個空的Intent去構(gòu)造PendingIntent,構(gòu)造PendingIntent的Intent一定要設(shè)置ComponentName或者action.