首页
/
每日頭條
/
生活
/
broadcaststate 配置
broadcaststate 配置
更新时间:2024-10-04 21:14:12

broadcaststate 配置?前言之前做線控耳機連點兩下切下一首歌的需求時, 曾經嘗試在BroadcastReceiver中用一個成員變量保存最後一次按下的時間, 但後來發現這個值一直是初始值, 對它賦值後, 再次收到Intent時發現它的值又變成初始值了.,下面我們就來說一說關于broadcaststate 配置?我們一起去了解并探讨一下這個問題吧!

broadcaststate 配置(BroadcastReceiver生命周期探讨)1

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中使用一個靜态成員變量記錄上一次點擊的時間.

,
Comments
Welcome to tft每日頭條 comments! Please keep conversations courteous and on-topic. To fosterproductive and respectful conversations, you may see comments from our Community Managers.
Sign up to post
Sort by
Show More Comments
推荐阅读
殲20是否用上ws15
殲20是否用上ws15
殲-20産量加速,是發動機有突破嗎?【每點新防務(814期)·7月4日】:據網上消息,目前殲-20的量産數量已經接近50架,但之前有消息推測在2018年底殲-20才裝備空軍28架,距今不過半年時間就增多了20架以上。看來殲-20似乎已經解決...
2024-10-04
抖音平台規則及注意事項
抖音平台規則及注意事項
抖音平台規則及注意事項?新賬号需要先養号:在正式開始發布内容前,最好先養号3-5天,主要的目的就是為了增加賬号的初始權重,我來為大家講解一下關于抖音平台規則及注意事項?跟着小編一起來看一看吧!抖音平台規則及注意事項新賬号需要先養号:在正式開...
2024-10-04
血常規主要看哪幾個指标
血常規主要看哪幾個指标
血常規是最常用的化驗手段之一,抽取外周靜脈血,費用大概是二十幾塊錢,半個小時左右就能出結果。在教大家看血常規的結果之前,先教大家怎麼看化驗單。下面是一張血常規的化驗單,有五列,大家關注第一列和第三列,第一列是項目名稱,我們來看第一列第一行,...
2024-10-04
火影忍者新版本排名
火影忍者新版本排名
Hello大家好,我是你們的小編阿慶。最近火影忍者手遊又迎來了重大更新,此次更新的主要内容是即将上線的全新團隊副本——忍界大戰,以及櫻花祭的一系列活動。好了,話不多說,快來一起看看這次更新的具體内容吧!【全新團隊副本更新預告】1、全新的13...
2024-10-04
dnf子午街在哪裡
dnf子午街在哪裡
dnf子午街在哪裡?進行進行星羅萬象活動所在地的星羅館就在子午街内,我來為大家科普一下關于dnf子午街在哪裡?以下内容希望對你有幫助!dnf子午街在哪裡進行進行星羅萬象活動所在地的星羅館就在子午街内。首先要進入五陵地區。無論是通過頻道選擇還...
2024-10-04
Copyright 2023-2024 - www.tftnews.com All Rights Reserved