安卓廣播超時的緣由分析及優化建議

前言

最終工做中常常碰到廣播超時的問題,因而花精力總結了一番,各位客官請看~android

基本概念

普通廣播與有序廣播

  • 普通廣播
    普通廣播是徹底異步的,邏輯上能夠在同一時刻被全部匹配的接受者接收到,消息傳遞效率高,缺點是接受者不能將處理結果傳遞給下一個接收者,也沒法終止廣播傳播。
    普工廣播是並行廣播。
  • 有序廣播
    有序廣播的接收者們將按照事先生命的優先級依次接收,數越大優先級越高(取值範圍:-1000~10000),優先級能夠聲明在<intent-filter android:priority="n".../>,也能夠調用IntentFilter對象的setPriority設置。而且接收者能夠終止傳播(調用abortBroadcast()方法便可終止),一旦終止後面接收者就沒法接受廣播。另外,接受者能夠將處理結果存入數據(可經過setResultExtras(Bundle)方法將數據存入Broadcast),當作Broadcast再傳遞給下一級接收者(可經過代碼Bundle bundle = getResultExtras(true)獲取上一級傳遞過來的數據)。
    有序廣播是串行廣播。

有序廣播的發送

各個時間點

  • enqueueClockTime 一次廣播插入到廣播隊列時的時間點,取System.currentTimeMillis()
  • dispatchTime 一次廣播從廣播隊列中被取出,準備開始發送,取SystemClock.uptimeMillis()
  • dispatchClockTime 含義同dispatchTime,取System.currentTimeMillis()
  • receiverTime 一次廣播中,開始派發給其中每一個接收者時的時間點,主要記錄的是有序廣播的狀況,取SystemClock.uptimeMillis()。
  • finishTime 一次廣播完成時的時間點
    每次把廣播發送給一個接受者以後會去檢查當前時間與dispatchTime 時間差是否大於超時時間,大於時就是ANR超時

時序圖

廣播超時時序圖.jpg異步

從圖中能夠看出決定廣播B接受者的廣播接受是否超時,取決於廣播A處理的時間和廣播B處理的時間優化

超時的緣由

  • 同一個廣播接收者較多,搶佔了後面的接收者容許處理的時間。廣播接受者較多也多是因爲代碼設計不合理,註冊了廣播監聽沒有解註冊有關。
  • Binder被耗盡,致使Binder通訊時間較長,擠壓了廣播處理的時間
  • 廣播接受的onReceive中作了繁重的任務
  • 系統資源緊張,CPU處理時間被搶佔

優化建議

  • 保證廣播監聽的註冊與解註冊成對實現
  • 同一個應用對同一個廣播的監聽應該使用同一個監聽者,不該該多處監聽
  • 在廣播的onreceive中不該該作繁重的任務
相關文章
相關標籤/搜索