安卓廣播機制學習筆記

2021-08-02 23:32:33 字數 1523 閱讀 9808

一,基本概念

1.廣播佇列

安卓原生有兩個廣播佇列,在ams中初始化,由建構函式可以看出5個構造引數意義

前台廣播佇列:mfgbroadcastqueue = new broadcastqueue(this, mhandler,

"foreground", broadcast_fg_timeout, false)

後台廣播佇列:mbgbroadcastqueue = new broadcastqueue(this, mhandler,

"background", broadcast_bg_timeout, true);

broadcastqueue(activitymanagerservice service, handler handler,

string name, long timeoutperiod, boolean allowdelaybehindservices)

二.廣播傳送

廣播傳送者可以決定:

1.通過設定flag來決定是否為前台廣播,預設是後台廣播

2.有序廣播還是無序廣播。

三.廣播接收器註冊

3.1靜態註冊:在manifest檔案中註冊的廣播接收器

3.2動態註冊:context.registerreceiver()註冊的廣播接收器

四.廣播分發(排程)

4.1廣播分發是ams排程的

無序廣播:首先是將無序的廣播一次全部分發給他的動態接收者(如果該廣播有動態註冊的接收器),不阻塞,無延遲。其次將廣播依次傳送給它的靜態註冊者。

會阻塞,有延遲。

有序廣播:不管接收者是動態註冊還是靜態註冊,都是依次分發。

靜態接收者,其所在的程序有可能沒有起來,系統為了避免短時間拉起很多程序,增加系統負擔,採用了依次分發。對於有序廣播,不管其接收者是動態靜態都是按照順序分發。

4.2分發過程中遇到的延遲以及廣播執行過程中的anr

對於依次分發的廣播(包括有序和無序),若果乙個廣播發生了延遲,勢必會導致後續的廣播延遲傳送,這樣會導致廣播接收者延遲接收,對那些依賴於廣播的ui互動,體驗變得

非常差,比如:乙個progressdialog的消失依賴與乙個廣播,這個廣播延遲傳送,導致一直等待狀態。

anr:

4.3對於以上問題的改進

(1) 由當前broadcastreceiver啟動新的service,在新的service中操作  

=> 再啟動乙個service, 並非好的方式,   正確姿勢: 直接post message到非同步handler thread.

(2) 使用goasync(), 將操作在非同步執行緒中執行

==> 

goasync

(3) 在特殊的場景下,廣播阻塞也許會影響**、簡訊等基礎體驗,如果不加以規範控制,後果會很嚴重。

(4) 系統廣播的頻繁註冊和使用問題, 以及如何減少廣播anr

==> 針對這個問題:  我說幾點建議

(d) 不要濫用廣播, 更不要什麼廣播都監聽, 只為做乙個統計的功能...

五.程序內的廣播

localbroadcast

安卓的廣播機制學習

今天學習的是安卓中廣播機制,在周五聽完實驗室陽仔的相關報告之後,我動手做了一些小練習,並且在過程中遇到了一些問題。1.在實現button的監聽是,我匯入的onclicklistener的包有誤,並不是android.view.view.onclicklitener 2.靜態註冊接收器時,使用了內部類...

安卓事件分發機制學習

在學習事件分發機制之前,需要先對以下幾個知識點有所了解 view和viewgroup什麼?事件 view 事件的分發機制 viewgroup事件的分發機制 一 view和viewgroup view view是所有ui元件的基類,viewgroup 是容納這些元件的容器,其本身也是從view派生出來...

Broadcast廣播機制 學習筆記

一 廣播機制簡介 1 標準廣播 是一種完全非同步執行的廣播,在廣播發出後,所有的廣播接收器幾乎同一時刻接收到這條廣播訊息,因此它們之間沒有任何先後順序可言,這種廣播效率會比較高,但是無法被截斷。sendbroadcast intent 2 有序廣播 是一種同步的廣播,在廣播發出後,同一時刻只會有乙個...