安卓編程技巧總結(jié)(2) 基礎(chǔ)組件開(kāi)發(fā)


1.intent傳值

Activity 間的數(shù)據(jù)通信煤禽,對(duì)于數(shù)據(jù)量比較大的享潜,避免使用 Intent + Parcelable
的方式,可以使用 EventBus布近、RxJava 等替代亩码,以免造成 TransactionTooLargeException丁恭。
  1. ActivityNotFoundException
Activity 間通過(guò)隱式 Intent 的跳轉(zhuǎn),在發(fā)出 Intent 之前盡可能通過(guò) resolveActivity
檢查疚俱,避免找不到合適的調(diào)用組件式塌,造成 ActivityNotFoundException 的異常武通。

正確做法:
Intent intent = new Intent(“Action”);
intent.setDataAndType("Data", "Type");
if (getPackageManager().resolveActivity(intent, PackageManager.MATCH_DEFAULT_ONLY) != null) {
try {
    startActivity(intent);
} catch (ActivityNotFoundException e) {
}
  1. 避免主線(xiàn)程執(zhí)行耗時(shí)操作
在主線(xiàn)程執(zhí)行耗時(shí)操作,會(huì)導(dǎo)致 UI 不流暢或ANR珊搀。下面情況應(yīng)多加注意:

避免在 BroadcastReceiver#onReceive()中執(zhí)行耗時(shí)操作冶忱,如果有耗時(shí)工作,
應(yīng)該創(chuàng)建 IntentService 完成境析,而不應(yīng)該在 BroadcastReceiver 內(nèi)創(chuàng)建子線(xiàn)程去做囚枪。
@Override
public void onReceive(Context context, Intent intent) {
  Intent intent = new Intent();
  intent .setClass(this, TestService.class);
  context .startService(intent );
}

public class TestService extends IntentService {
......
@Override
protected void onHandleIntent(Intent intent) {
synchronized (this) {
try {
......
} catch (Exception e) {
}

避免在 Service.onStartCommand()/onBind()方法中執(zhí)行耗時(shí)操作派诬,如果確實(shí)有需求,應(yīng)改用 IntentService 或采用其他異步機(jī)制完成链沼。

  1. 廣播的效率與安全處理
避免使用隱式 Intent 廣播敏感信息默赂,信息可能被其他注冊(cè)了對(duì)應(yīng)
BroadcastReceiver 的 App 接收。

通過(guò) Context.sendBroadcast()發(fā)送的隱式廣播會(huì)被所有感興趣的 receiver 接收括勺,惡意應(yīng)用注冊(cè)監(jiān)聽(tīng)該廣播的 receiver 可能會(huì)獲取到 Intent 中傳遞的敏感信息缆八,并進(jìn)行其他危險(xiǎn)操作。

通過(guò) Context.sendOrderedBroadcast()方法發(fā)送的有序廣播疾捍,優(yōu)先級(jí)較高的惡意 receiver 可能直接丟棄該廣播奈辰,造成服務(wù)不可用,或者向廣播結(jié)果塞入惡意數(shù)據(jù)乱豆。

如果廣播僅限于應(yīng)用內(nèi)奖恰,應(yīng)該使用 LocalBroadcastManager.sendBroadcast()實(shí)
現(xiàn),避免敏感信息外泄和 Intent 攔截的風(fēng)險(xiǎn)宛裕,也提高了廣播接收的效率瑟啃。

import android.support.v4.content.LocalBroadcastManager;
/**
 * 類(lèi):MessageTip 消息提醒類(lèi)
 * 了解更多,請(qǐng)參考《消息系統(tǒng)實(shí)現(xiàn)方案》
 * 作者: qxc
 * 日期:2017/9/1.
 */
public class MessageTip {
    /**
     * 消息提醒類(lèi)實(shí)例
     */
    private static MessageTip messageTip;

    /**
     * 本地廣播數(shù)據(jù)類(lèi)型實(shí)例
     */
    private LocalBroadcastManager localBroadcastManager;   

    ......

    /**
     * 檢查消息
     * @param context 上下文
     */
    public void checkMessage(final Context context){
        //獲得本地廣播實(shí)例
        if(localBroadcastManager==null) {
            localBroadcastManager = LocalBroadcastManager.getInstance(context);
        }

        //定時(shí)刷新數(shù)據(jù)
        ......
    }

    /**
     * 獲得消息提醒數(shù)量并發(fā)送本地廣播
     */
    public void getMessageTipNum(Context context){
        //判斷是否顯示消息提示數(shù)量
        if(AppTools.getCurrUser().getUid()==0 || !(NetWorkUtils.getInstance().isNetworkAvailable(context))){
            //發(fā)送本地廣播
            if(localBroadcastManager != null) {
                Intent intent  = new Intent();
                intent.setAction(ACTIONMESSAGETIP);
                intent.putExtra(KEYISSHOWTIPNUM, isShowTipNum);
                localBroadcastManager.sendBroadcast(intent);
            }
            return;
        }
        //獲得用戶(hù)消息數(shù)量
        getUserMessageNum(context);
    }
  ......

Activity或者Fragment中動(dòng)態(tài)注冊(cè)BroadCastReceiver時(shí)揩尸,registerReceiver()和 unregisterReceiver()要成對(duì)出現(xiàn)!!!
  1. Activity釋放資源的時(shí)機(jī)
不要在 Activity#onDestroy()內(nèi)執(zhí)行釋放資源的工作蛹屿,例如一些工作線(xiàn)程的
銷(xiāo)毀和停止,因?yàn)?onDestroy()執(zhí)行的時(shí)機(jī)可能較晚岩榆±澹可根據(jù)實(shí)際需要,在
Activity#onPause()/onStop()中結(jié)合 isFinishing()的判斷來(lái)執(zhí)行朗恳。

6.Fragment

如非必須,避免使用嵌套的 Fragment载绿。Fragment 嵌套使用會(huì)有一些坑粥诫,容易出現(xiàn) bug。
onActivityResult()方法的處理錯(cuò)亂崭庸;
內(nèi)嵌的 Fragment 可能收不到該方法的回調(diào)怀浆,需要由宿主 Fragment 進(jìn)行轉(zhuǎn)發(fā)處理;
被繼承的 setRetainInstance()怕享,導(dǎo)致在 Fragment 重建時(shí)多次觸發(fā)不必要的邏輯执赡。

添加Fragment 時(shí),確保 FragmentTransaction#commit() 在Activity#onPostResume()或者 FragmentActivity#onResumeFragments()內(nèi)調(diào)用函筋。
Activity可能因?yàn)楦鞣N原因被銷(xiāo)毀沙合,Android支持頁(yè)面被銷(xiāo)毀前通過(guò)
Activity#onSaveInstanceState() 保 存 自 己 的 狀 態(tài) 。 但 如 果FragmentTransaction.commit()發(fā)生在 Activity 狀態(tài)保存之后跌帐,就會(huì)導(dǎo)致 Activity 重建首懈、恢復(fù)狀態(tài)時(shí)無(wú)法還原頁(yè)面狀態(tài)绊率,從而可能出錯(cuò)。
為了避免給用戶(hù)造成不好的體驗(yàn)究履,系統(tǒng)會(huì)拋出 IllegalStateExceptionStateLoss 異常滤否。
推薦的做法是在 Activity 的onPostResume() 或 onResumeFragments() ( 對(duì) FragmentActivity ) 里
執(zhí)行FragmentTransaction.commit(),如有必要也可在 onCreate()里執(zhí)行最仑。

7.顯示調(diào)用service等組件

用顯式 Intent 啟動(dòng)或者綁定 Service藐俺,且不要為服務(wù)聲明 Intent Filter,保證應(yīng)用的安全性泥彤。
如果確實(shí)需要使用隱式調(diào)用欲芹,則可為 Service 提供 Intent Filter并從 Intent 中排除相應(yīng)的組件名稱(chēng),
但必須搭配使用 Intent#setPackage()方法設(shè)置Intent 的指定包名全景,這樣可以充分消除目標(biāo)服務(wù)的不確定性耀石。

Service 需要以多線(xiàn)程來(lái)并發(fā)處理多個(gè)啟動(dòng)請(qǐng)求,建議使用 IntentService爸黄;

8.Activity效率

當(dāng)前Activity的onPause方法執(zhí)行結(jié)束后才會(huì)執(zhí)行下一個(gè)Activity的onCreate方法滞伟,
所以在 onPause 方法中不適合做耗時(shí)較長(zhǎng)的工作,這會(huì)影響到頁(yè)面之間的跳轉(zhuǎn)效率炕贵。
  1. Adapter 滑動(dòng)錯(cuò)亂
使用 Adapter 的時(shí)候梆奈,如果使用了 ViewHolder 做緩存,在 getView()的方法中無(wú)論這項(xiàng) convertView 的
每個(gè)子控件是否需要設(shè)置屬性(比如某個(gè) TextView設(shè)置的文本可能為 null称开,某個(gè)按鈕的背景色為透明亩钟,某控件的顏色為透明等),
都需要為其顯式設(shè)置屬性(Textview 的文本為空也需要設(shè)置 setText("")鳖轰,背景透明也需要設(shè)置)清酥,
否則在滑動(dòng)的過(guò)程中,因?yàn)?adapter item 復(fù)用的原因蕴侣,會(huì)出現(xiàn)內(nèi)容的顯示錯(cuò)亂焰轻。

10.日志輸出

不要使用 System.out.println 打印,盡量使用 log昆雀,因?yàn)閘og更可控一些:
log可分等級(jí)輸出
log可過(guò)濾
log可檢索

注意:log的tag不能為空辱志,即“”,因?yàn)槿罩镜?tag 是空字符串沒(méi)有任何意義狞膘,不利于過(guò)濾日志揩懒。
......

第一篇: 安卓編程技巧總結(jié)(1) 資源與UI布局處理

http://www.reibang.com/p/ff97b15d5c9d

第二篇: 安卓編程技巧總結(jié)(2) 基礎(chǔ)組件開(kāi)發(fā)

http://www.reibang.com/p/b05752377887

第三篇:安卓編程技巧總結(jié)(3) 進(jìn)程與線(xiàn)程處理

http://www.reibang.com/p/7d05c8a368bd

第四篇:安卓編程技巧總結(jié)(4) 數(shù)據(jù)文件處理

http://www.reibang.com/p/0515df3b697d

第五篇:安卓編程技巧總結(jié)(5) 圖片處理

http://www.reibang.com/p/76690b2ba310

第六篇:安卓編程技巧總結(jié)(6) APP安全分析

http://www.reibang.com/p/4347ff392122

第七篇:安卓編程技巧總結(jié)(7) 性能檢測(cè)代碼分析

http://www.reibang.com/p/687f3c641408

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市挽封,隨后出現(xiàn)的幾起案子已球,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 212,718評(píng)論 6 492
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件和悦,死亡現(xiàn)場(chǎng)離奇詭異退疫,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)鸽素,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,683評(píng)論 3 385
  • 文/潘曉璐 我一進(jìn)店門(mén)褒繁,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人馍忽,你說(shuō)我怎么就攤上這事啰劲⊥舛ⅲ” “怎么了絮爷?”我有些...
    開(kāi)封第一講書(shū)人閱讀 158,207評(píng)論 0 348
  • 文/不壞的土叔 我叫張陵壶硅,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我瓦呼,道長(zhǎng)喂窟,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 56,755評(píng)論 1 284
  • 正文 為了忘掉前任央串,我火速辦了婚禮磨澡,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘质和。我一直安慰自己稳摄,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 65,862評(píng)論 6 386
  • 文/花漫 我一把揭開(kāi)白布饲宿。 她就那樣靜靜地躺著厦酬,像睡著了一般。 火紅的嫁衣襯著肌膚如雪瘫想。 梳的紋絲不亂的頭發(fā)上仗阅,一...
    開(kāi)封第一講書(shū)人閱讀 50,050評(píng)論 1 291
  • 那天,我揣著相機(jī)與錄音国夜,去河邊找鬼减噪。 笑死,一個(gè)胖子當(dāng)著我的面吹牛支竹,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播鸠按,決...
    沈念sama閱讀 39,136評(píng)論 3 410
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼礼搁,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了目尖?” 一聲冷哼從身側(cè)響起馒吴,我...
    開(kāi)封第一講書(shū)人閱讀 37,882評(píng)論 0 268
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后饮戳,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體豪治,經(jīng)...
    沈念sama閱讀 44,330評(píng)論 1 303
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,651評(píng)論 2 327
  • 正文 我和宋清朗相戀三年扯罐,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了负拟。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,789評(píng)論 1 341
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡歹河,死狀恐怖掩浙,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情秸歧,我是刑警寧澤厨姚,帶...
    沈念sama閱讀 34,477評(píng)論 4 333
  • 正文 年R本政府宣布,位于F島的核電站键菱,受9級(jí)特大地震影響谬墙,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜经备,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 40,135評(píng)論 3 317
  • 文/蒙蒙 一拭抬、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧弄喘,春花似錦玖喘、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,864評(píng)論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至急但,卻和暖如春澎媒,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背波桩。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 32,099評(píng)論 1 267
  • 我被黑心中介騙來(lái)泰國(guó)打工戒努, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人镐躲。 一個(gè)月前我還...
    沈念sama閱讀 46,598評(píng)論 2 362
  • 正文 我出身青樓储玫,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親萤皂。 傳聞我的和親對(duì)象是個(gè)殘疾皇子撒穷,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 43,697評(píng)論 2 351

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

  • Android 自定義View的各種姿勢(shì)1 Activity的顯示之ViewRootImpl詳解 Activity...
    passiontim閱讀 171,862評(píng)論 25 707
  • 轉(zhuǎn)自 1. 什么是Activity? 四大組件之一,一般的,一個(gè)用戶(hù)交互界面對(duì)應(yīng)一個(gè)activity setCon...
    joe1632閱讀 1,392評(píng)論 0 7
  • 本文同步發(fā)表在 http://lawlietxxl.github.io/2016/06/09/mastering-...
    lawlietxxl閱讀 473評(píng)論 0 4
  • 29、RHEXISTASY 陽(yáng)光以純白的姿態(tài)流瀉裆熙,落上角落里靜默的劍身端礼。青年輕輕撫過(guò)金色劍柄的手邊禽笑,翡翠色寶石...
    Lancenot閱讀 2,308評(píng)論 1 3