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