一份合格的代碼不該只知足於實現功能, 更應該遵循良好的規範. 遵循良好的代碼規範有利於:java
這裏梳理一下Android開發過程當中須要注意的一些地方, 包括多個部分, 另外根據約束力強弱分爲兩類:android
下面是規範正文git
這一部分是項目整體上的要求, 包括 系統設計, 命名方式, 可見性, 註釋, 代碼風格 等幾部分.算法
include/merge
;Activity
內多Fragment
之間的直接溝通, 必須經過Activity
中轉;Kotlin
語言;LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter
等所屬同一登陸模塊的文件放入一個文件夾, 而不是全部activity
放入一個文件夾, 全部adapter
放入一個文件夾.LoginActivity.kt, NewsAdapter.kt, NewsBean.java
;login_activity.xml, login_logo.png
;class LoginPresenter {}, class NewsBean {}
;LoginPresenter loginPresenter, NewsBean newsBean
;public static final boolean IS_RELESAE = true
;android:id="@+id/tvLogin"
文件/資源命名時採用 模塊+類型 的方式, 以便迅速查找相關內容, 例如登陸頁面: LoginActivity.kt, login_activity.xml, login_logo.png, <string name="login_net_error">網絡錯誤</string>, <color name="login_page_backgroud">#f3f3f3</color>
數據庫
java使用的佈局中的id名建議使用小駝峯方式, 而且使用控件類型縮寫開頭, 例: android:id="@+id/tvLogin"
, 附錄經常使用控件縮寫:json
控件 | 縮寫 |
---|---|
LinearLayout | ll |
RelativeLayout | rl |
ConstraintLayout | cl |
ListView | lv |
ScollView | sv |
TextView | tv |
Button | btn |
ImageView | iv |
CheckBox | cb |
RadioButton | rb |
EditText | et |
private
, 只有在其餘類須要引用時再看狀況標爲public, protected, package-private
;final
關鍵字;/** * Created by XXX on 2019/6/19. * 描述此類做用, 邏輯複雜的說明一下主要思路 */
public class LoginPresenter {
/** * 用於進行網絡請求 * @params xxx XXX */
public void doLoginRequest(...){}
}
複製代碼
@params, @return
的參數描述錯誤的狀況, 必須實時更新;/* */
的方式;@Nullable, @NotNull, @UiThread
等註解;此git目錄下同時存有 AndroidCodeStyleSetting.jar
配置文件, 用於AndroidStudio導入後按照統一風格進行代碼的格式化.緩存
若是沒有編寫代碼時隨時格式化代碼的習慣, 能夠在AndroidStudio
版本控制提交窗口右側Before Commit
中勾選Reformat code
選項.安全
主要包括 基本組件, UI/佈局, 進程/線程/消息推送, 文件/數據庫, 圖片/動畫, 安全性等幾個部分.服務器
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ ONLY) != null)
;LocalBroadcastManager.getInstance(this).sendBroadcast(intent)
, 不容許 context.sendBroadcast(intent)
, 避免外部應用攔截;Application
中緩存數據, 全局的共享數據可使用某presenter
存儲, 或者使用SharedPreference
讀寫;Activity
或者Fragment
中動態註冊BroadCastReceiver
時,registerReceiver
和unregisterReceiver
必需要成對出現;Activity#onPause/onStop
中結合isFinishing
的判斷來執行資源的釋放, 必免放在執行時機較晚的Activity#onDestroy()
中執行;Activity#onPause
中執行耗時操做, 這樣會致使界面跳轉卡頓, 能夠放入Activity#onStop
中執行;ConstraintLayout
, 能夠保證無嵌套的狀況下完成包括部分控件同時顯隱需求在內的99%的佈局要求;ScrollView
包裹ListView/GridView/ExpandableListVIew
等列表View, 複雜多項式列表可使用多ItemType
進行處理;Activity
中顯示對話框或彈出浮層時, 儘可能使用DialogFragment
, 而非Dialog/AlertDialog
, 便於隨Activity
生命週期管理彈窗的生命週期;Application
中的初始化代碼要根據進程分別處理, 避免初始化沒必要要的業務;new Thread()
的方式;Activity/Fragment
中使用Handler
時, 必須使用靜態內部類+WeakReferences方式或者在onStop
中調用handler.removeCallbacksAndMessages
;ContentProvider
替代SharedPreferences#MODE_MULTI_PROCESS
;android.os.Environment#getExternalStorageDirectory(), Context#getFilesDir()
, 錯誤示例: File file = new File("/mnt/sdcard/Download/Album", name)
;Environment.MEDIA_MOUNTED.equals(Environment.getExternalStorageState())
;Cursor
使用以後必須關閉, 以避免內存泄漏;SharedPreference
僅存儲簡單數據類型, 不要存儲複雜數據, 如json數據/Bitmap編碼等;SharedPreference
提交數據時, 儘可能使用Editor#apply()
, 而非Editor#commit()
;Activity.onPause()/onStop()
中關閉當前activity
正在執行的動畫;AnimationDrawable
, 佔用很是多內存;ARGB_565
代替ARGB_888
, 減小內存佔用;Animation
執行結束時, 調用View.clearAnimation()
釋放相關資源;AES/DES/DESede
加密算法時, 不要使用默認的加密模式ECB
, 應顯示指定使用CBC/CFB
加密模式;android:debuggable
爲false;X509TrustManager
子類中的checkServerTrusted
函數效驗服務器端證書的合法性,android:allowbackup
屬性設置爲false
, 防止adb backup
導出應用數據;