broadcaststate 配置?前言之前做線控耳機連點兩下切下一首歌的需求時, 曾經嘗試在BroadcastReceiver中用一個成員變量保存最後一次按下的時間, 但後來發現這個值一直是初始值, 對它賦值後, 再次收到Intent時發現它的值又變成初始值了.,下面我們就來說一說關于broadcaststate 配置?我們一起去了解并探讨一下這個問題吧!
前言
之前做線控耳機連點兩下切下一首歌的需求時, 曾經嘗試在BroadcastReceiver中用一個成員變量保存最後一次按下的時間, 但後來發現這個值一直是初始值, 對它賦值後, 再次收到Intent時發現它的值又變成初始值了.
後來看到一些問題, 問BroadcastReceiver的生命周期, 按理說它就一個onReceive能有什麼生命周期, 其實這裡問的生命周期和我們平時說的Activity的生命周期還是有區别的.
BroadcastReceiver對象的生命周期
問題的根源在于, 在AndroidManifest.xml中注冊的BroadcastReceiver, 每次收到一個Intent, 也就是onReceive被回調的時候, 這個BroadcastReceiver都是新創建出來的, 官方文檔中寫:
A BroadcastReceiver object is only valid for the duration of the call to onReceive(Context, Intent). Once your code returns from this function, the system considers the object to be finished and no longer active.
也就是說, 出了onReceive, 這個BroadcastReceiver對象的生命周期就已經到頭了, 這也是為什麼我們不能在onReceive中進行一些異步操作的原因, 有可能異步操作還沒完成, BroadcastReceiver所在的進程就被kill了.
表現出來的結果就是, BroadcastReceiver中的成員變量無法保存它們的值, 因為它們每次都是重新創建的, 之前的已經随着BroadcastReceiver對象被銷毀了.
但是有一種情況, BroadcastReceiver的成員變量是可用的, 那就是動态注冊的BroadcastReceiver. 動态注冊的BroadcastReceiver對象的生命其實是受我們控制的.
實際測試, 使用Context.registerReceiver和Context.unregisterReceiver注冊的BroadcastReceiver每次收到廣播都是使用我們注冊時傳入的對象處理的, 這也是符合我們代碼上的邏輯的. 當然, 此時靜态變量也是可用的.
BroadcastReceiver所在進程的生命周期
對于那種在AndroidManifest.xml中靜态注冊的BroadcastReceiver, 成員變量是沒法用了, 有人說, 是不是用static變量就可以了呢, 某些情況下是可以的, 什麼情況呢, 就是進程不會被kill的情況.
官方文檔裡面有一段
Once you return from onReceive(), the BroadcastReceiver is no longer active, and its hosting process is only as important as any other application components that are running in it.
在AndroidManifest.xml中靜态注冊的BroadcastReceiver的onReceive被回調時, 有可能這個進程隻承載了這個BroadcastReceiver, 比如我們的應用沒有運行的情況, 等onReceive返回, 這個時候我們的進程的會被視為空進程(empty process), 此時Android有極大可能回收掉空進程, 這種情況下靜态成員變量也無法保存值了.
如果我們的程序正在運行, 則Android不一定會回收掉我們的進程, 因為此時我們的進程級别會以進程中承載的級别最高的組件為準. 在我的實際項目中, 我是在播放歌曲的情況下監聽線控耳機的按下Intent, 這個時候我的應用是有一個前台服務播放歌曲的, 此時我的進程至少是可見進程(visible process)級别, 幾乎不會被Android kill掉, 所以我可以在BroadcastReceiver中使用一個靜态成員變量記錄上一次點擊的時間.
,更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!