阿里Android開發(fā)規(guī)范筆記

阿里的android開發(fā)規(guī)范已經(jīng)出來有幾個(gè)月了盹牧,不過今天我才看俩垃,看完后對(duì)自己以前不夠規(guī)范或者容易犯錯(cuò)的地方進(jìn)行筆記記錄便于以后查閱。

原版手冊(cè)地址:https://yq.aliyun.com/attachment/download/?id=5261

一? Android基本組件

【強(qiáng)制】Activity間通過隱式Intent的跳轉(zhuǎn)汰寓,在發(fā)出Intent之前必須通過resolveActivity 檢查口柳,避免找不到合適的調(diào)用組件,造成ActivityNotFoundException 的異常有滑。

正例:

public void viewUrl(String url, String mimeType) {

? ? Intent intent = new Intent(Intent.ACTION_VIEW);

? ? intent.setDataAndType(Uri.parse(url), mimeType);

? ? if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ ONLY) != null) {

? ? ? ? startActivity(intent);

? ? ? }else {

? ? ? // 找不到指定的Activity

? ? }

}

反例:

Intent intent = new Intent();

intent.setAction("com.example.DemoIntent ");

try {

? ? startActivity(intent); } catch (ActivityNotFoundException e) {

? ? e.printStackTrace();

}?

5. 【強(qiáng)制】避免在BroadcastReceiver#onReceive()中執(zhí)行耗時(shí)操作跃闹,如果有耗時(shí)工作, 應(yīng)該創(chuàng)建IntentService 完成毛好,而不應(yīng)該在BroadcastReceiver 內(nèi)創(chuàng)建子線程去做望艺。

說明:

由于該方法是在主線程執(zhí)行,如果執(zhí)行耗時(shí)操作會(huì)導(dǎo)致 UI 不流暢肌访≌夷可以使用 IntentService 、創(chuàng)建 HandlerThread 或者調(diào)用 Context#registerReceiver (BroadcastReceiver, IntentFilter, String, Handler)方法等方式吼驶,在其他Wroker線程 執(zhí)行 onReceive 方法惩激。BroadcastReceiver#onReceive()方法耗時(shí)超過 10 秒鐘,可 能會(huì)被系統(tǒng)殺死蟹演。


6. 【強(qiáng)制】避免使用隱式 Intent 廣播敏感信息风钻,信息可能被其他注冊(cè)了對(duì)應(yīng) BroadcastReceiver的App接收。

說明:

通過Context#sendBroadcast()發(fā)送的隱式廣播會(huì)被所有感興趣的receiver接收酒请,惡 意應(yīng)用注冊(cè)監(jiān)聽該廣播的 receiver 可能會(huì)獲取到 Intent 中傳遞的敏感信息骡技,并進(jìn)行 其他危險(xiǎn)操作。如果發(fā)送的廣播為使用 Context#sendOrderedBroadcast()方法發(fā)送 的有序廣播蚌父,優(yōu)先級(jí)較高的惡意 receiver 可能直接丟棄該廣播哮兰,造成服務(wù)不可用, 或者向廣播結(jié)果塞入惡意數(shù)據(jù)苟弛。

如果廣播僅限于應(yīng)用內(nèi)喝滞,則可以使用 LocalBroadcastManager#sendBroadcast()實(shí) 現(xiàn),避免敏感信息外泄和Intent攔截的風(fēng)險(xiǎn)膏秫。


8. 【推薦】不要在 Activity#onDestroy()內(nèi)執(zhí)行釋放資源的工作右遭,例如一些工作線程的 銷毀和停止,因?yàn)?onDestroy()執(zhí)行的時(shí)機(jī)可能較晚缤削【焦可根據(jù)實(shí)際需要,在 Activity#onPause()/onStop()中結(jié)合isFinishing()的判斷來執(zhí)行亭敢。


11.【推薦】Service 需要以多線程來并發(fā)處理多個(gè)啟動(dòng)請(qǐng)求滚婉,建議使用 IntentService, 可避免各種復(fù)雜的設(shè)置帅刀。


13.【推薦】當(dāng)前 Activity 的 onPause 方法執(zhí)行結(jié)束后才會(huì)創(chuàng)建(onCreate)或恢復(fù) (onRestart)別的Activity让腹,所以在onPause方法中不適合做耗時(shí)較長(zhǎng)的工作远剩,這 會(huì)影響到頁(yè)面之間的跳轉(zhuǎn)效率。



二 UI與布局

2. 【推薦】在 Activity 中顯示對(duì)話框或彈出浮層時(shí)骇窍,盡量使用 DialogFragment瓜晤,而非 Dialog/AlertDialog,這樣便于隨Activity生命周期管理對(duì)話框/彈出浮層的生命周期


5. 【推薦】文本大小使用單位 dp腹纳,View 大小使用單位 dp痢掠。對(duì)于 TextView,如果在文 字大小確定的情況下推薦使用 wrap_content 布局避免出現(xiàn)文字顯示不全的適配問 題嘲恍。

說明:

之所以文本大小也推薦使用dp而非sp足画,因?yàn)閟p是Android早期推薦使用的,但其 實(shí) sp 不僅和 dp 一樣受屏幕密度的影響佃牛,還受到系統(tǒng)設(shè)置里字體大小的影響锌云,所以 使用dp對(duì)于應(yīng)用開發(fā)會(huì)更加保證UI的一致性和還原度


10.【推薦】盡量不要使用 AnimationDrawable,它在初始化的時(shí)候就將所有圖片加載 到內(nèi)存中吁脱,特別占內(nèi)存,并且還不能釋放彬向,釋放之后下次進(jìn)入再次加載時(shí)會(huì)報(bào)錯(cuò)兼贡。

說明:

Android 的幀動(dòng)畫可以使用 AnimationDrawable 實(shí)現(xiàn),但是如果你的幀動(dòng)畫中如果 包含過多幀圖片娃胆,一次性加載所有幀圖片所導(dǎo)致的內(nèi)存消耗會(huì)使低端機(jī)發(fā)生 OOM 異常遍希。幀動(dòng)畫所使用的圖片要注意降低內(nèi)存消耗,當(dāng)圖片比較大時(shí)里烦,容易出現(xiàn)OOM凿蒜。


11.【強(qiáng)制】不能使用 ScrollView 包裹 ListView/GridView/ExpandableListVIew;因?yàn)檫@ 樣會(huì)把 ListView 的所有 Item 都加載到內(nèi)存中,要消耗巨大的內(nèi)存和 cpu 去繪制圖 面胁黑。

說明:

ScrollView中嵌套List或RecyclerView的做法官方明確禁止废封。除了開發(fā)過程中遇到 的各種視覺和交互問題,這種做法對(duì)性能也有較大損耗丧蘸。ListView等UI組件自身有 垂直滾動(dòng)功能漂洋,也沒有必要在嵌套一層ScrollView。目前為了較好的UI體驗(yàn)力喷,更貼 近Material Design的設(shè)計(jì)刽漂,推薦使用NestedScrollView


12.【強(qiáng)制】不要在 Android 的 Application 對(duì)象中緩存數(shù)據(jù)〉苊希基礎(chǔ)組件之間的數(shù)據(jù)共享 請(qǐng)使用Intent等機(jī)制贝咙,也可使用SharedPreferences等數(shù)據(jù)持久化機(jī)制。


13.【推薦】使用 Toast 時(shí)拂募,建議定義一個(gè)全局的 Toast 對(duì)象庭猩,這樣可以避免連續(xù)顯示 Toast時(shí)不能取消上一次Toast消息的情況窟她。即使需要連續(xù)彈出Toast,也應(yīng)避免直 接調(diào)用Toast#makeText眯娱。


五礁苗、進(jìn)程、線程與消息通信


1. 【強(qiáng)制】不要通過 Intent 在 Android 基礎(chǔ)組件之間傳遞大數(shù)據(jù)(binder transaction 緩存為1MB)徙缴,可能導(dǎo)致OOM试伙。

2. 【強(qiáng)制】在 Application 的業(yè)務(wù)初始化代碼加入進(jìn)程判斷,確保只在自己需要的進(jìn)程 初始化于样。特別是后臺(tái)進(jìn)程減少不必要的業(yè)務(wù)初始化疏叨。

3. 【強(qiáng)制】新建線程時(shí),必須通過線程池提供(AsyncTask 或者 ThreadPoolExecutor 或者其他形式自定義的線程池)穿剖,不允許在應(yīng)用中自行顯式創(chuàng)建線程蚤蔓。

說明:

使用線程池的好處是減少在創(chuàng)建和銷毀線程上所花的時(shí)間以及系統(tǒng)資源的開銷,解 決資源不足的問題糊余。如果不使用線程池秀又,有可能造成系統(tǒng)創(chuàng)建大量同類線程而導(dǎo)致消耗完內(nèi)存或者“過度切換”的問題。另外創(chuàng)建匿名線程不便于后續(xù)的資源使用分析贬芥, 對(duì)性能分析等會(huì)造成困擾吐辙。


4. 【強(qiáng)制】線程池不允許使用Executors去創(chuàng)建,而是通過ThreadPoolExecutor的方 式蘸劈,這樣的處理方式讓寫的同學(xué)更加明確線程池的運(yùn)行規(guī)則昏苏,規(guī)避資源耗盡的風(fēng)險(xiǎn)。


七威沫、Bitmap贤惯、Drawable與動(dòng)畫


6. 【強(qiáng)制】在Activity#onPause()或Activity#onStop()回調(diào)中,關(guān)閉當(dāng)前activity正在執(zhí) 行的的動(dòng)畫


9.【推薦】使用 RGB_565 代替 RGB_888棒掠,在不怎么降低視覺效果的前提下孵构,減少內(nèi) 存占用


10.【推薦】盡量減少Bitmap(BitmapDrawable)的使用,盡量使用純色(ColorDrawable)句柠、 漸變色(GradientDrawable)浦译、 StateSelector(StateListDrawable)等與 Shape 結(jié) 合的形式構(gòu)建繪圖


12.【參考】大圖片資源不要直接打包到apk,可以考慮通過文件倉(cāng)庫(kù)遠(yuǎn)程下載溯职,減小包 體積精盅。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市谜酒,隨后出現(xiàn)的幾起案子叹俏,更是在濱河造成了極大的恐慌,老刑警劉巖僻族,帶你破解...
    沈念sama閱讀 219,270評(píng)論 6 508
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件粘驰,死亡現(xiàn)場(chǎng)離奇詭異屡谐,居然都是意外死亡,警方通過查閱死者的電腦和手機(jī)蝌数,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,489評(píng)論 3 395
  • 文/潘曉璐 我一進(jìn)店門愕掏,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人顶伞,你說我怎么就攤上這事饵撑。” “怎么了唆貌?”我有些...
    開封第一講書人閱讀 165,630評(píng)論 0 356
  • 文/不壞的土叔 我叫張陵滑潘,是天一觀的道長(zhǎng)。 經(jīng)常有香客問我锨咙,道長(zhǎng)语卤,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 58,906評(píng)論 1 295
  • 正文 為了忘掉前任酪刀,我火速辦了婚禮粹舵,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘骂倘。我一直安慰自己齐婴,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 67,928評(píng)論 6 392
  • 文/花漫 我一把揭開白布稠茂。 她就那樣靜靜地躺著,像睡著了一般情妖。 火紅的嫁衣襯著肌膚如雪睬关。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,718評(píng)論 1 305
  • 那天毡证,我揣著相機(jī)與錄音电爹,去河邊找鬼。 笑死料睛,一個(gè)胖子當(dāng)著我的面吹牛丐箩,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播恤煞,決...
    沈念sama閱讀 40,442評(píng)論 3 420
  • 文/蒼蘭香墨 我猛地睜開眼屎勘,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來了居扒?” 一聲冷哼從身側(cè)響起概漱,我...
    開封第一講書人閱讀 39,345評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎喜喂,沒想到半個(gè)月后瓤摧,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體竿裂,經(jīng)...
    沈念sama閱讀 45,802評(píng)論 1 317
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 37,984評(píng)論 3 337
  • 正文 我和宋清朗相戀三年照弥,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了腻异。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 40,117評(píng)論 1 351
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡这揣,死狀恐怖悔常,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情曾沈,我是刑警寧澤这嚣,帶...
    沈念sama閱讀 35,810評(píng)論 5 346
  • 正文 年R本政府宣布,位于F島的核電站塞俱,受9級(jí)特大地震影響姐帚,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜障涯,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,462評(píng)論 3 331
  • 文/蒙蒙 一罐旗、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧唯蝶,春花似錦九秀、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,011評(píng)論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至征字,卻和暖如春都弹,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背匙姜。 一陣腳步聲響...
    開封第一講書人閱讀 33,139評(píng)論 1 272
  • 我被黑心中介騙來泰國(guó)打工畅厢, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人氮昧。 一個(gè)月前我還...
    沈念sama閱讀 48,377評(píng)論 3 373
  • 正文 我出身青樓框杜,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親袖肥。 傳聞我的和親對(duì)象是個(gè)殘疾皇子咪辱,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,060評(píng)論 2 355

推薦閱讀更多精彩內(nèi)容