android adapter 按钮隐藏 第一个无效_Android开发规范
注釋
類/復雜或者不能從方法名字看出意圖的方法必須添加注釋
/*** @Author: LiuJinYang
* @CreateDate: 2020/5/16 9:32
* 網絡請求工具類
*/
public class RetrofitUtil {
/**
* 添加公參basic
*
* @param key 公參字段名
* @param value 公參值
*/
public void addBasic(String key, String value) {
basicMap.put(key, value);
}
}
命名
類命名,類文件名使用 UpperCameCase 風格, 必須遵從駝峰形式, 且要保證從類的名稱上能區分出它是什么功能類型;
方法名第一個單詞要體現出方法的功能 例如:save, set, get, insert, create;
對象使用小駝峰方式, 例: LoginPresenter loginPresenter, NewsBean newsBean;
全局變量和局部變量功能相同時:全局加 “m”。參數名,可以和成員變量名相同,但要注意引用成員變量時,需要加上 this 字段
常量:全部大寫,單詞之間使用 “_” 分隔。
代碼中的命名嚴禁使用拼音與英文混合的方式,更不允許直接使用中文方式;正確的英文拼寫和語法可以讓閱讀者易于理解, 避免歧義。純拼音命名方式也不要使用。
抽象類命名使用 Abstract 或者 Base 開頭,異常類命名使用 Exception 結尾;測試類以他要測試的類的名稱開始,以 Test 結束。
資源文件命名
layout文件命名:
Fragment 的 layout 以 module_fragment 開頭
Dialog 的 layout 以 module_dialog 開頭
include 的 layout 以 module_include 開頭
ListView 的行 layout 以 module_list_item 開頭
RecyclerView 的 item layout 以 module_recycle_item 開頭
GridView 的 item layout 以 module_grid_item 開頭
drawable命名:
模塊名_業務功能描述_控件描述_控件狀態限定詞, 如:module_login_btn_pressed,module_tabs_icon_home_normal
anim 命名:
模塊名_邏輯名稱_[方向|序號],如 module_fade_in , module_fade_out , module_push_down_in
color命名:
模塊名_邏輯名稱_顏色,如:#33b5e5e5
dimen 命名:
模塊名_描述信息,如:1dp
string 命名:
模塊名_邏輯名稱,如:moudule_login_tips,module_homepage_notice_desc
id 命名:
推薦使用小寫字母并用下劃線進行分割,View 組件的資源 id 建議以 View 的縮寫作為前綴。常用縮寫表如下:
LinearLayout llRelativeLayout rl
ConstraintLayout cl
ListView lv
ScollView sv
TextView tv
Button btn
ImageView iv
CheckBox cb
RadioButton rb
EditText et
Android 基本組件
Android 基 本 組 件 指 Activity 、 Fragment 、 Service 、 BroadcastReceiver 、ContentProvider 等等。
Activity 間的數據通信, 對于數據量比較大的,避免使用 Intent + Parcelable的方式,可以考慮 EventBus/RxBus 等替代方案,以免造成 TransactionTooLargeException。
Activity 間通過隱式 Intent 的跳轉,在發出 Intent 之前必須通過 resolveActivity檢查,避免找不到合適的調用組件,造成 ActivityNotFoundException 的異常。
避免在 Service#onStartCommand()/onBind()方法中執行耗時操作,如果確 實有需求,應改用 IntentService 或采用其他異步機制完成。
避免在 BroadcastReceiver#onReceive()中執行耗時操作,如果有耗時工作, 應該創建 IntentService 完成,而不應該在 BroadcastReceiver 內創建子線程去做。
避免使用隱式 Intent 廣播敏感信息,信息可能被其他注冊了對應 BroadcastReceiver 的 App 接收。
對于只用于應用內的廣播,優先使用 LocalBroadcastManager 來進行注冊 和發送,LocalBroadcastManager 安全性更好,同時擁有更高的運行效率。
Activity或者Fragment中動態注冊BroadCastReceiver時,registerReceiver() 和 unregisterReceiver()要成對出現。
不要在 Activity#onDestroy()內執行釋放資源的工作,例如一些工作線程的 銷毀和停止,因為 onDestroy()執行的時機可能較晚。可根據實際需要,在Activity的onPause()/onStop()中結合 isFinishing()的判斷來執行。
當前 Activity 的 onPause 方法執行結束后才會創建(onCreate)或恢復 (onRestart)別的 Activity,所以在 onPause方法中不適合做耗時較長的工作,這會影響到頁面之間的跳轉效率。
Service 需要以多線程來并發處理多個啟動請求,建議使用 IntentService, 可避免各種復雜的設置。
UI 與布局
布局xml優先使用ConstraintLayout, 可以保證無嵌套的情況下完成包括部分控件同時顯隱需求在內的99%的布局要求;
布局中不得不使用 ViewGroup 多重嵌套時,不要使用 LinearLayout 嵌套, 改用 RelativeLayout,可以有效降低嵌套數。
在 Activity 中顯示對話框或彈出浮層時,盡量使用 DialogFragment,而非 Dialog/AlertDialog,這樣便于隨Activity生命周期管理對話框/彈出浮層的生命周期。
禁止在非 UI 線程進行 View 相關操作。
禁止在設計布局時多次為子 View 和父 View 設置同樣背景進而造成頁面過 度繪制,推薦將不需要顯示的布局進行及時隱藏。
不能使用 ScrollView 包裹 RecyclerView/ListView/GridView/ExpandableListVIew;因為這 樣會把 ListView 的所有 Item 都加載到內存中,要消耗巨大的內存和 cpu 去繪制圖面。
不要在 Android 的 Application 對象中緩存數據。基礎組件之間的數據共享 請使用 Intent 等機制,也可使用 SharedPreferences 等數據持久化機制。
使用 Adapter 的時候,如果你使用了 ViewHolder 做緩存,在 getView()的 方法中無論這項 convertView 的每個子控件是否需要設置屬性(比如某個 TextView 設置的文本可能為 null,某個按鈕的背景色為透明,某控件的顏色為透明等),都需 要為其顯式設置屬性(Textview 的文本為空也需要設置 setText(""),背景透明也需要 設置),否則在滑動的過程中,因為 adapter item 復用的原因,會出現內容的顯示錯 亂。
進程、線程與消息通信
不要通過 Intent 在 Android 基礎組件之間傳遞大數據(binder transaction 緩存為 1MB),可能導致 OOM。
在 Application 的業務初始化代碼加入進程判斷,確保只在自己需要的進程 初始化。特別是后臺進程減少不必要的業務初始化。
@Override
public void onCreate() {
//在所有進程中初始化
....
//僅在主進程中初始化
if (mainProcess) {
...
}
//僅在后臺進程中初始化
if (bgProcess) {
...
}
}
}
新建線程時,必須通過線程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定義的線程池),不允許在應用中自行顯式創建線程。
線程池不允許使用 Executors 去創建,而是通過 ThreadPoolExecutor 的方 式,這樣的處理方式讓寫的同學更加明確線程池的運行規則,規避資源耗盡的風險。
子線程中不能更新界面,更新界面必須在主線程中進行,網絡操作不能在 主線程中調用。
新建線程時,定義能識別自己業務的線程名稱,便于性能優化和問題排查。
public MyThread(){
super.setName("ThreadName");
…
}
}
ThreadPoolExecutor 設置線程存活時間(setKeepAliveTime),確保空閑時 線程能被釋放。
禁 止 在 多 進 程 之 間 用 SharedPreferences 共 享 數 據 , 雖 然 可 以(MODE_MULTI_PROCESS,已過時),但官方已不推薦。
謹慎使用 Android 的多進程,多進程雖然能夠降低主進程的內存壓力,但 會遇到如下問題:
首次進入新啟動進程的頁面時會有延時的現象(有可能黑屏、白屏幾秒,是白屏還是黑屏和新 Activity 的主題有關);
應用內多進程時,Application實例化多次,需要考慮各個模塊是否都需要在所有進程中初始化。
文件與數據庫
任何時候不要硬編碼文件路徑,請使用 Android 文件系統 API 訪問。
當使用外部存儲時,必須檢查外部存儲的可用性。
應用間共享文件時,不要通過放寬文件系統權限的方式去實現,而應使用 FileProvider。
SharedPreference 中只能存儲簡單數據類型(int、boolean、String 等), 復雜數據類型建議使用文件、數據庫等其他方式存儲。
數據庫 Cursor 必須確保使用完后關閉,以免內存泄漏。
多線程操作寫入數據庫時,需要使用事務,以免出現同步問題。
執行 SQL 語句時,應使用 SQLiteDatabase#insert()、update()、delete(), 不要使用 SQLiteDatabase#execSQL(),以免 SQL 注入風險。
如果 ContentProvider 管理的數據存儲在 SQL 數據庫中,應該避免將不受 信任的外部數據直接拼接在原始 SQL 語句中。
Bitmap、Drawable 與動畫
png 圖片使用 TinyPNG 或者類似工具壓縮處理,減少包體積。
使用完畢的圖片,應該及時回收,釋放寶貴的內存。
loadBitmapAsync(new OnResult(result){
bitmap = result;
});
...使用該 bitmap...// 使用結束,在 2.3.3 及以下需要調用 recycle()函數,在 2.3.3 以上 GC 會自動管理,除非你明確不需要再用。
if (Build.VERSION.SDK_INT <= Build.VERSION_CODES.GINGERBREAD_MR1) {
bitmap.recycle();}
bitmap = null;
在 Activity#onPause()或 Activity#onStop()回調中,關閉當前 activity 正在執行的的動畫。
//頁面退出,及時清理動畫資源
mImageView.clearAnimation()
}
在動畫或者其他異步任務結束時,應該考慮回調時刻的環境是否還支持業 務處理。例如 Activity 的onStop() 函數已經執行, 且在該函數中主動釋放了資源, 此時回調中如果不做判斷就會空指針崩潰。
使用 RGB_565 代替 RGB_888,在不怎么降低視覺效果的前提下,減少內 存占用。
大圖片資源不要直接打包到 apk,可以考慮通過文件倉庫遠程下載,減小包 體積。
當 View Animation 執行結束時,調用View.clearAnimation()釋放相關資源。
安全
將 android:allowbackup 屬性必須設置為 false,阻止應用數據被導出。
如果使用自定義 HostnameVerifier 實現類,必須在 verify()方法中校驗服務 器主機名的合法性,否則可能受到中間人攻擊;如果使用自定義X509TrustManager 實現類,必須在 checkServerTrusted()方法中校驗服務端證書的合法性,否則可能受到中間人攻擊。
@Override
public boolean verify(String hostname, SSLSession session) {
if("yourhostname".equals(hostname)){
return true;
} else {
HostnameVerifier hv = HttpsURLConnection.getDefaultHostnameVerifier();
return hv.verify(hostname, session);
}
}
};
在 SDK 支持的情況下,Android 應用必須使用 V2 簽名,這將對 APK 文 件的修改做更多的保護。
所有的 Android 基本組件(Activity、Service、BroadcastReceiver、 ContentProvider 等)都不應在沒有嚴格權限控制的情況下,將android:exported 設置為 true。
WebView 應設置 WebView#getSettings()#setAllowFileAccess(false)、 WebView#getSettings()#setAllowFileAccessFromFileURLs(false) 、 WebView#getSettings()#setAllowUniversalAccessFromFileURLs(false),阻止 file scheme URL 的訪問。
不要把敏感信息打印到 log 中。
確保應用發布版本的 android:debuggable 屬性設置為 false。
本地加密秘鑰不能硬編碼在代碼中,更不能使用 SharedPreferences 等本 地持久化機制存儲。應選擇 Android自身的秘鑰庫(KeyStore)機制或者其他安全 性更高的安全解決方案保存。
addJavascriptInterface() 可以添加 JS 對本地 Java 方法的調用,但這本身 會導致惡意代碼的攻擊。在 Android 4.2(API Level 17)以下, 不應再使用這樣的調用方式。在 Android 4.2 及以上, 需要對本地被遠程調用的方法顯式添加@JavascriptInterface annotation。
使用 Android 的 AES/DES/DESede 加密算法時,不要使用 ECB 加密模式, 應使用 CBC 或 CFB 加密模式; MD5 和 SHA-1、SHA-256 等常用算法是 Hash 算法,有一定的安全性,但不能代替加密算法。敏感信息的存儲和傳輸,需要使用專業的加密機制。
定的密鑰,相同的明文將會生成相同的密文,容易受到字典攻擊,建議使用 CBC、
CFB 或 OFB 等模式。
1) ECB:Electronic codebook,電子密碼本模式
2) CBC:Cipher-block chaining,密碼分組鏈接模式
3) CFB:Cipher feedback,密文反饋模式
4) OFB:Output feedback,輸出反饋模式
Android APP 在 HTTPS 通信中,驗證策略需要改成嚴格模式。
在 Android 4.2(API Level 17)及以上,對安全性要求較高的應用可在 Activity中,對 Activity 所關聯的 Window 應用 WindowManager.LayoutParams.FLAG_SECURE, 防止被截屏、錄屏。但要注意的是,一個 Activity 關聯的 Window 可能不止一個,如果使用了 Dialog / DialogFragment 等控件彈出對話框,它們本身也會創建一個新的 Window,也一樣需要保護。
系統設計
不允許出現兩段相同的邏輯塊, 必須抽出為公共方法, 差異性使用參數控制, 避免修改時多處修改導致遺漏;
不允許出現兩段相同的處于同一邏輯組的復雜布局, 必須抽為單獨的include/merge;
不允許Activity內多Fragment之間的直接溝通, 必須通過Activity中轉;
采用模塊分類方式替代文件類別方式, 方便快速查找模塊相關內容, 例: LoginActivity/LoginPreenter/LoginHttpRequest/LoginBean/LoginAdapter等所屬同一登錄模塊的文件放入一個文件夾, 而不是所有activity放入一個文件夾, 所有adapter放入一個文件夾。
所有新定義的類/方法, 默認寫成private, 只有在其他類需要引用時再看情況標為public, protected, package-private;
java定義的父類中定義的方法如果子類重寫會導致問題時, 添加final關鍵字;
其他
不能使用 System.out.println 打印 log。
Log 的 tag 不能是" "。
項目建立REWADME.md文件,書寫版本迭代中較重要的修改,包括需求修改,代碼修改,三方庫引用等;
參考資料
阿里巴巴 Android 開發手冊
我是今陽,如果想要進階和了解更多的干貨,歡迎關注公眾號接收我的最新文章
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的android adapter 按钮隐藏 第一个无效_Android开发规范的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 邵阳学院学校云认证码_湖南所有五年制大专
- 下一篇: ajax mysql项目 react_R