<form id="jrnpn"><form id="jrnpn"></form></form>

    <form id="jrnpn"><span id="jrnpn"><track id="jrnpn"></track></span></form>
    <em id="jrnpn"></em>

    
    
    <form id="jrnpn"><form id="jrnpn"></form></form>

      <form id="jrnpn"><nobr id="jrnpn"><th id="jrnpn"></th></nobr></form>

        <sub id="jrnpn"><listing id="jrnpn"></listing></sub>

        學IT,好工作,就讀北大青鳥

        北大青鳥電話028-86763871
        ×

        當前位置: 首頁 > 青鳥知識 > Android

        用廣播來更新UI界面好嗎?

        2017-08-21

        做為Android四大組件之一的,廣播被很多人所熟知,可算是一種非常方便的解耦組件的手段。常用的方式是直接調用Context的接口(sendBroadcast & sendOrderBroadcast)發送兩類型的廣播:8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        Normal broadcasts無序廣播,會異步的發送給所有的Receiver,接收到廣播的順序是不確定的,有可能是同時。
        Ordered broadcasts有序廣播,廣播會先發送給優先級高(android:priority)的Receiver,而且這個Receiver有權決定是繼續發送到下一個Receiver或者是直接終止廣播。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        當然,靜態和動態的兩種注冊Receiver的方式也難不住面試者。只是有時為了看一下面試者是否真的全面了解廣播,會問一下:8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        除了上面的兩種廣播外,還有其他類型的廣播嗎?8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        允許我心里小小的邪惡一下。很少有人知道這種方式的,可以使用sendStickyBroadcast發送Sticky類型的廣播。Sticky簡單說就是,在發送廣播時Reciever還沒有被注冊,但它注冊后還是可以收到在它之前發送的那條廣播。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        有時候基于數據安全考慮,我們想發送廣播只有自己(本進程)能接收到,那么該如何去做呢?8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        在我不知道有新的API或者框架時我常常喜歡用自己現有的知識去想方案,最后再Google一下看是否有更好的。這個問題,我會先想到權限,發送廣播時限定有權限(receiverPermission)的接收者才能收到。但是我們知道APK太容易被反編譯,注冊廣播的權限也只是一個字符串,并不安全。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        然后可能使用Handler,沒錯,往主線程的消息池(Message Queue)發送消息,只有主線程的Handler可以分發處理它,廣播發送的內容是一個Intent對象,我們可以直接用Message封裝一下,留一個和sendBroadcast一樣的接口。在handleMessage時把Intent對象傳遞給已注冊的Receiver。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        后來在看項目組的其他同事寫代碼時,發現還有一個LocalBroadcastManager類,查了一下官方文檔是Support V4包里的一個類,其實現方式也是使用Handler,思路也是一樣的。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        BroadcastReceiver的生命周期8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        有些人并不態清楚Receiver也是有生命周期的,而且很短,當它的onReceive方法執行完成后,它的生命周期就結束了。這時BroadcastReceiver已經不處于active狀態,被系統殺掉的概率極高,也就是說如果你在onReceive去開線程進行異步操作或者打開Dialog都有可能在沒達到你要的結果時進程就被系統殺掉。因為這個進程可能只有這個Receiver這個組件在運行,當Receiver也執行完后就是一個empty進程,是最容易被系統殺掉的。替代的方案是用Notificaiton或者Service(這種情況當然不能用bindService)。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        回到今天的面試題,使用廣播來更新界面是否合適?8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        更新界面也分很多種情況,如果不是頻繁地刷新,使用廣播來做也是可以的。但對于較頻繁地刷新動作,建議還是不要使用這種方式。廣播的發送和接收是有一定的代價的,它的傳輸是通過Binder進程間通信機制來實現的(細心人會發現Intent是實現了Parcelable接口的),那么系統定會為了廣播能順利傳遞做一些進程間通信的準備。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        除此之外,還可能有其他的因素讓廣播發送和到達是不準時的(或者說接收是會延時)。曾經看到有人在論壇上抱怨發幾個廣播都卡,Google的工程師是怎么混飯吃的。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        這種情況可能嗎?很可能,而且很容易發生。我們要先了解Android的ActivityManagerService有一個專門的消息隊列來接收發送出來的廣播,sendBroadcast執行完后就立即返回,但這時發送來的廣播只是被放入到隊列,并不一定馬上被處理。當處理到當前廣播時,又會把這個廣播分發給注冊的廣播接收分發器ReceiverDispatcher,ReceiverDispatcher最后又把廣播交給接Receiver所在的線程的消息隊列去處理(就是你熟悉的UI線程的Message Queue)。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        整個過程從發送--ActivityManagerService--ReceiverDispatcher進行了兩次Binder進程間通信,最后還要交到UI的消息隊列,如果基中有一個消息的處理阻塞了UI,當然也會延遲你的onReceive的執行。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        小結

        在項目里還是有遇到開發骨干也會在onReceive中開線程做耗時操作,很多時候他們這樣做了并不會立刻就會產生問題,但是并不等于不會產生問題,當設備達到特定的臨界條件時(如內存緊張),這些問題往往會在最終用戶那里報出來。我們都有經驗由用戶報出來的隨機BUG往往難于跟蹤和修復,所以理解清楚一些基礎的機制是很有必要的,它們能幫助我們避免一些隱藏的風險。8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站



        8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站


        8Qb北大青鳥_北大青鳥計算機培訓學校_北大青鳥優越教育官方網站

        • 成都總部地址:成都市武侯區天益街38理想中心3棟3樓
          咨詢電話:028-86763871
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        • 北京佳音旗艦校區地址:北京市西城區北禮士路100號
          咨詢電話:400-601-0802
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        • 貴陽優越校區地址:貴陽市高新區國家數字內容產業園
          咨詢電話:400-680-0851
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        • 沈陽三好校區地址:沈陽市和平區三好街54號
          咨詢電話:400-855-1066
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        • 蘭州優越校區地址:蘭州市安寧區興安路教育港
          咨詢電話:0931-7701993
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        • 上海人民廣場校區地址:上海市黃浦區云南北路59號六合大廈13樓(人民廣場地鐵口5號出,正北方向500米)
          寶山校區地址:上海市寶山區紀蘊路588號5號樓B區2樓
          咨詢電話:021-61113200
          面授課程:啟蒙星課程、軟件開發工程師課程、網絡工程師課程、Java全棧工程師課程、WEB全棧課程、.Net工程師課程、全棧軟件測試培訓、UI/UE設計師課程、大數據培訓、云計算課程
        <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <蜘蛛词>| <文本链> <文本链> <文本链> <文本链> <文本链> <文本链>