Register Receiver in Manifest or Component(ex:Service、Activity)

羅大偉
羅大偉
Aug 9, 2017 · 2 min read

前言

最近在公司開發輸入法,有一項需求是,

當系統語言改變時,

輸入法也會更改預設的語言。

這個需求其實很簡單,用個Receiver就可以搞定這件事情。

問題

但很神奇的是,我被咱家的QC回報,這個功能有BUG,

BUG內容是,系統語言改完,要過數秒後,

輸入法的語言才跟著被改變,太慢了!!

原因

後來發現原因,是因為我註冊Receiver時,

是直接在Manifest上註冊的,

並非透過元件(component)的生命週期之中註冊,

上網查了資料,與經過測試以後,發現這兩種註冊方式,

是有很大的差異的。

解答

  • Manifest上註冊:當App被安裝後,會告知系統,有這麼一隻App,他有需要監聽這些事件的需求。接下來,如果這隻App沒有跑起來,那麼系統會預設建立一個Process,用來幫忙監聽廣播,但這種方式收到廣播的時間會比較長,反應較慢。
  • 從元件上,用programming的方式去註冊:當App被執行時,只會在開發者選擇註冊或註銷的時機,去註冊或註銷。這種方式通常用在,App對於這個廣播訊息,並沒有需求要隨時監聽,或者是不想佔用載具的效能、增加載具負擔。這種方式收到廣播的時間一般會比較短,反應較快。

參考資料

Welcome to a place where words matter. On Medium, smart voices and original ideas take center stage - with no ads in sight. Watch
Follow all the topics you care about, and we’ll deliver the best stories for you to your homepage and inbox. Explore
Get unlimited access to the best stories on Medium — and support writers while you’re at it. Just $5/month. Upgrade