Android開發經驗總結
-
在Android library中不能使用switch-case語句訪問資源ID: 在Android library中不能使用switch-case語句訪問資源ID的原因分析及解決方案
-
不能在Activity沒有完全顯示時顯示PopupWindow和Dialog: popupwindow - Problems creating a Popup Window in Android Activity
-
在多進程之間不要用SharedPreferences共享數據,雖然可以(MODE_MULTI_PROCESS),但極不穩定: android - MODE_MULTI_PROCESS for SharedPreferences isn’t working
-
有些時候不能使用Application的Context,不然會報錯(比如啟動Activity,顯示Dialog等):
-
同一個應用的JNI代碼,不要輕易換NDK編譯的版本,否則會有很多問題(主要是一些方法實現不一樣,并且高版本對代碼的檢測更嚴格),比如r8沒有問題,但到r9就有問題了,這是個大坑;
-
Android的JNI代碼中,有返回類型的函數沒有返回值編譯的時候也不會報錯;
-
當前Activity的onPause方法執行結束后才會執行下一個Activity的onCreate方法,所以在onPause方法中不適合做耗時較長的工作,這會影響到頁面之間的跳轉效率;
-
謹慎使用Android的透明主題,透明主題會導致很多問題,比如:如果新的 Activity采用了透明主題,那么當前Activity的onStop方法不會被調用;在設置為透明主題的Activity界面按Home鍵時,可能 會導致刷屏不干凈的問題;進入主題為透明主題的界面會有明顯的延時感;
-
不要在非UI線程中初始化ViewStub,否則會返回null;
-
公共接口一定要考慮到代碼重入的情況,能設計為單例就盡量用單例;
-
不要通過Bundle傳遞大塊的數據,否則會報TransactionTooLargeException異常: java - Issue: Passing large data to second Activity
-
盡量不要通過Application緩存數據,這不穩定: 不要在Android的Application對象中緩存數據!
-
盡量不要使用AnimationDrawable,它在初始化的時候就將所有圖片加載到內存中,特別占內存,并且還不能釋放,釋放之后下次進入再次加載時會報錯;9圖不能通過tinypng壓縮,不然會有問題;
-
genymotion模擬器快是因為它是基于x86架構的,如果你的應用中用到了so,但沒有x86架構的so,只能放棄使用它;Android Studio的模擬器也一樣;
-
Eclipse的Android開發環境配置好后不要輕易升級ADT和build tools,不然會浪費你很多時間,還有就是一個workspace中的工程不要太多,不然每次啟動都會很慢;
-
Android studio每個版本、gradle每個版本差別都比較大(我是這樣認為的),對于jni代碼的編譯建議在Eclipse中進行,如果在Android studio中開發jni會浪費很多時間,主要是編譯腳本的配置比較麻煩;
-
Eclipse中的Lint太不靠譜,特別是主工程中依賴library的時候,很多提示都是有問題的,建議使用Android Studio的工程清理工具,特別推薦;
-
不同API版本的AsyncTask實現不一樣,有的是可以同時執行多個任務,有的API中只能同時執行一個線程,所以在程序中同時執行多個AsyncTask時有可能遇到一個AsyncTask的excute方法后很久都沒有執行。 調用AsyncTask的excute方法不能立即執行程序的原因分析及改善方案
-
同一個應用,相同的圖片分別放在drawable-xxhdpi、drawable-xhdpi、drawable-hdpi、drawable- mdpi、drawable-ldpi中,在同一設備中占用的內存會大不一樣(設備的dpi是固定的,圖片放在不同的dpi文件夾下,在設備上顯示時需要 將圖片轉換成和當前屏幕一樣dpi后在設備中顯示,所以即使該圖片在不同dpi文件夾下大小一樣,但放在內存中的大小卻不是一樣的,并不一定是長 寬 4),做應用的內存優化之前可以先看一看你的工程是如何做屏幕適配的,是否有優化的空間。強烈推薦這個屏幕適配視頻教程,花兩個半小時就能看完: Android-屏幕適配全攻略
-
謹慎對待數據庫升級(比如需要在原數據庫中增加字段),避免數據丟失或者操作數據庫異常的情況,數據庫升級方法可以查閱《第一行代碼》P263;
-
多個程序共用一套代碼(一套代碼,在桌面上多個圖標)時需要處理好不同入口進入時的堆棧問題;
-
使用Adapter的時候,如果你使用了ViewHolder做緩存,在 getView的方法中無論這項的每個視圖是否需要設置屬性(比如TextView設置的屬性可能為null,item的某一個按鈕的背景為透明、某一項 的顏色為透明等),都需要為每一項的所有視圖設置屬性(textview的屬性為空也需要設置setText(“”),背景透明也需要設置),否則在滑動 的過程中會出現內容的顯示錯亂。
-
謹慎使用Android的多進程,多進程雖然能夠降低主進程的內存壓力,但會遇到如下問題:
(1)不能實現完全退出所有Activity的功能(如果有同行在應用內采用多進程成功實現過完全退出程序歡迎溝通交流);
(2)首次進入新啟動進程的頁面時會有延時的現象(有可能黑屏、白屏幾秒,是白屏還是黑屏和新Activity的主題有關);
(3)應用內多進程時,新啟動一個進程都會重新跑一次Application的onCreate方法,不上重新創建一個Application,但會重新跑Application的onCreate,這樣就不能在Application中緩存數據作為內存共享的途徑了;
(4)多進程間通過SharedPreferences共享數據時不穩定,具體可以查閱《Android開發藝術探索》。
-
使用Toast時,建議定義一個全局的Toast對象,這樣可以避免連續顯示Toast時不能取消上一次Toast消息的情況(如果你有連續彈出Toast的情況,避免使用Toast.makeText);
-
View的面積越大繪制的時間就越長,透明通道對View的繪制速度影響很大;
-
不要通過Msg傳遞大的對象,會導致內存問題;
-
關于AS的使用經驗,參見: Android Studio使用過程中需要弄明白的一些問題
-
Eclipse的工程轉成AS的版本后,在同一個機器中安裝會 報”INSTALL_FAILED_VERSION_DOWNGRADE“這個錯誤,原因是因為as除了可以在Manifest.xml文件中設置apk 的版本名和版本號,還可以在build.gradle文件中設置apk的版本名和版本號,記得修改build.gralde中的版本名和版本號到最新就可 以了;
-
通常情況下,在插入USB之后可能會跳轉到一個新的界面,這時候可能你本來是橫屏 的,突然跳轉到這個新界面是豎屏的,雖然你的界面被壓在下面,但是還是會被強制橫豎屏切換一次,如果這時候你的界面不做處理就會重載,如果你的界面里面有 很多fragment,這時候的重載更加復雜,難以處理。所以建議不做橫豎屏切換的界面都弄一下橫豎屏切換不重載。
-
如果你在 manifest 中把一個 activity 設置成 android:windowSoftInputMode=”adjustResize”,那么 ScrollView(或者其它可伸縮的 ViewGroups)會縮小,從而為軟鍵盤騰出空間。但是,如果你在 activity 的主題中設置了 android:windowFullscreen=”true”,那么 ScrollView 不會縮小。這是因為該屬性強制 ScrollView 全屏顯示。然而在主題中設置 android:fitsSystemWindows=”false” 也會導致 adjustResize 不起作用;
-
做自定義手寫功能時,底層上報的點并不會都在MotionEvent中能夠及時接收 到,比如底層一秒鐘200個點,上層收到的可能只有幾十個點,為了提高手寫的流暢度,在onTouchEvent中,通過MotionEvent中的 getHistorySize能夠獲取到從底層傳輸到上層過程中所有的點。