日更挑戰(zhàn)-安卓廣播接收者


越不懂的越愛裝
大家都同等:IT世界沒有難不難,只有是否了解過

挑戰(zhàn)目錄

什么是安卓中的廣播

是安卓程序之間或單個程序內(nèi)部傳遞消息的機(jī)制之一赃份。
按發(fā)送者(廣播來源)分為系統(tǒng)廣播和自定義廣播涨冀。
按注冊方式分為靜態(tài)注冊廣播和動態(tài)注冊廣播辜膝。
按功能分為系統(tǒng)廣播法牲、默認(rèn)廣播识埋、有序廣播瘫辩、粘性廣播(廢棄)烦秩、App應(yīng)用內(nèi)廣播味悄。


系統(tǒng)廣播和自定義廣播

  • 系統(tǒng)廣播

    發(fā)送者為系統(tǒng)自己發(fā)送澈缺,注冊和接收的實(shí)現(xiàn)和自定義廣播一致坪创。

  • 為什么要使用自定義廣播而不是自己實(shí)現(xiàn)廣播模式


靜態(tài)注冊和動態(tài)注冊廣播

  • 靜態(tài)注冊
    常駐,不受任何組件的生命周期影響

    適用于需要時刻監(jiān)聽的廣播

    在xml文件中生命注冊

    耗電姐赡,占內(nèi)存

    1. 定義廣播

      class 靜態(tài)廣播注冊():BroadcastReceiver() {
      
          override fun onReceive(p0: Context?, p1: Intent?) {
              Toast.makeText(p0,"廣播接收", Toast.LENGTH_SHORT).show()
          }
      }
      
    2. 注冊廣播

      <?xml version="1.0" encoding="utf-8"?>
      <manifest xmlns:android="http://schemas.android.com/apk/res/android">
          <application>
              <receiver android:name=".靜態(tài)廣播注冊"
                  android:enabled="true"  <!--  -->
                  android:exported="true" <!-- 是否接收其他應(yīng)用的廣播 -->
                  android:permission="mypermission" <!-- 具有相應(yīng)權(quán)限的發(fā)送者,才能往這個接收者發(fā)送廣播 -->
                  >  
                  <intent-filter>
                      <action android:name="MyTest"/>  <!-- action -->
                  </intent-filter>
              </receiver>
          </application>
      </manifest>
      
    3. 發(fā)送廣播

      class MainActivity : AppCompatActivity() {
      
          override fun onCreate(savedInstanceState: Bundle?) {
              super.onCreate(savedInstanceState)
              setContentView(R.layout.activity_main)
          }
      
          fun sendBroadcastReceiver(view: View) {
              tv_sendBroadcastReceiver.setOnClickListener {
                  val intent = Intent()
                  intent.action = "MyTest"
                  intent.putExtra("參數(shù)","參數(shù)值")
                  sendBroadcast(intent)
              }
          }
      }
      
  • 動態(tài)注冊
    非常駐廣播
    在代碼中動態(tài)聲明
    跟隨組件生命周期變化
    適用于需要特定時刻監(jiān)聽的廣播

    class MainActivity : AppCompatActivity() {
    
        private lateinit var receiver:TestReceiver
    
        override fun onCreate(savedInstanceState: Bundle?) {
            super.onCreate(savedInstanceState)
            setContentView(R.layout.activity_main)
            val intentFilter = IntentFilter()
            intentFilter.addAction("test")
            receiver = TestReceiver()
            //動態(tài)注冊廣播
            registerReceiver(receiver,intentFilter)
        }
    
          //xml布局中的點(diǎn)擊事件莱预,發(fā)送廣播
        fun sendBroadcastReceiver(view: View) {
            tv_sendBroadcastReceiver.setOnClickListener {
                val intent = Intent()
                intent.action = "test"
                intent.putExtra("參數(shù)","參數(shù)值")
                sendBroadcast(intent)
            }
        }
    
          //及時注銷廣播,防止內(nèi)存泄露
        override fun onPause() {
            super.onPause()
            unregisterReceiver(receiver) //及時注銷廣播项滑,防止內(nèi)存泄露
        }
    
        class TestReceiver : BroadcastReceiver() {
            override fun onReceive(p0: Context?, p1: Intent?) {
                Toast.makeText(p0,"廣播接收",Toast.LENGTH_SHORT).show()
              }
          }
      }
    
    • 動態(tài)注冊在何時注銷比較好
      盡量在onResume注冊依沮,在onPause注銷。

      因?yàn)閛nPause是App死亡前肯定會執(zhí)行的方法。但是當(dāng)系統(tǒng)內(nèi)存不足時危喉,App在執(zhí)行完onPause后就會被銷毀宋渔,來不及執(zhí)行onStop、onDestory方法辜限。


系統(tǒng)廣播皇拣、默認(rèn)廣播、有序廣播列粪、粘性廣播(廢棄)审磁、App應(yīng)用內(nèi)廣播

  • 系統(tǒng)廣播

  • 默認(rèn)廣播

    1. 特點(diǎn):
      • 所有的接受者之間是異步的
      • 接收者相互之間不會有影響
      • 接收者無法阻止其他接收者接收
      • 優(yōu)先級、setResultExtras(Bundle())岂座、abortBroadcast等有序廣播API的設(shè)置無效
  • 有序廣播

    1. 特點(diǎn):

      • 通過sendOrderedBroadcast(intent,null)發(fā)送态蒂,第二個參數(shù)為權(quán)限,傳null表示不需要任何權(quán)限
      • 根據(jù)優(yōu)先級(-1000到1000)從大到小接收廣播
      • 同優(yōu)先級動態(tài)注冊的先接收
      • 同優(yōu)先級先注冊的先接收
      • 通過xml的intent-filter的priority或者intentFilter.priority=xx指定優(yōu)先級
      • 在接收方法onReceive里可以使用setResultExtras(Bundle())設(shè)置下一個接收者的接收到的數(shù)據(jù)
      • 在接收方法onReceive里可以使用abortBroadcast終止廣播
      • 在接收方法onReceive里可以使用resultData傳遞字符串?dāng)?shù)據(jù)
    2. 有序廣播sendOrderedBroadcast(intent,null)的權(quán)限參數(shù):?

  • 粘性廣播(廢棄)

  • App應(yīng)用內(nèi)廣播

    1. 特點(diǎn):
      • 廣播不會發(fā)送
    2. 關(guān)于费什,發(fā)送本地廣播
      • 將上面實(shí)現(xiàn)廣播的代碼的注冊钾恢、取消注冊、發(fā)送中的context參數(shù)改為 LocalBroadcastManager.getInstance(this)
    3. 關(guān)于鸳址,接收時防止惡意接收到特殊構(gòu)造的廣播攻擊:
      • 將exported設(shè)置為false瘩蚪,使得只接收本應(yīng)用廣播
      • 發(fā)送和接收時,增加權(quán)限字段稿黍,也可防止
      • 發(fā)送廣播時通過intent.setPackage(receiverPackageName)指定廣播接收器對應(yīng)的包名

onReceive(p0: Context?, p1: Intent?)方法中的Context

  • 本地廣播+動態(tài)注冊:Activity Context
  • 本地廣播+靜態(tài)注冊:Application Context
  • 非本地廣播+動態(tài)注冊:Activity Context
  • 非本地廣播+靜態(tài)注冊:ReceiverRestricted Context

onReceive(p0: Context?, p1: Intent?)方法中的Intent


安卓8.0后廣播的改動

  • 在AndroidManifest.xml中注冊無效的廣播
    1. 屏幕的開疹瘦、關(guān)廣播
    2. 電量的變化廣播
    3. 等等
  • 有序廣播的接收者必須配置優(yōu)先級,防止接收順序錯亂
  • 只能通過動態(tài)注冊的方式巡球,實(shí)現(xiàn)有序廣播言沐。

安卓廣播源碼實(shí)現(xiàn)

  • 靜態(tài)廣播注冊原理

    1. 在系統(tǒng)啟動的時候通過PackageManagerService掃描已安裝應(yīng)用進(jìn)行注冊。具體掃描代碼如下:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末酣栈,一起剝皮案震驚了整個濱河市险胰,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌矿筝,老刑警劉巖起便,帶你破解...
    沈念sama閱讀 222,252評論 6 516
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異窖维,居然都是意外死亡榆综,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,886評論 3 399
  • 文/潘曉璐 我一進(jìn)店門陈辱,熙熙樓的掌柜王于貴愁眉苦臉地迎上來奖年,“玉大人,你說我怎么就攤上這事沛贪÷兀” “怎么了震贵?”我有些...
    開封第一講書人閱讀 168,814評論 0 361
  • 文/不壞的土叔 我叫張陵,是天一觀的道長水评。 經(jīng)常有香客問我猩系,道長,這世上最難降的妖魔是什么中燥? 我笑而不...
    開封第一講書人閱讀 59,869評論 1 299
  • 正文 為了忘掉前任寇甸,我火速辦了婚禮,結(jié)果婚禮上疗涉,老公的妹妹穿的比我還像新娘拿霉。我一直安慰自己,他們只是感情好咱扣,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,888評論 6 398
  • 文/花漫 我一把揭開白布绽淘。 她就那樣靜靜地躺著,像睡著了一般闹伪。 火紅的嫁衣襯著肌膚如雪沪铭。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,475評論 1 312
  • 那天偏瓤,我揣著相機(jī)與錄音杀怠,去河邊找鬼。 笑死厅克,一個胖子當(dāng)著我的面吹牛赔退,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播证舟,決...
    沈念sama閱讀 41,010評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼离钝,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了褪储?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 39,924評論 0 277
  • 序言:老撾萬榮一對情侶失蹤慧域,失蹤者是張志新(化名)和其女友劉穎鲤竹,沒想到半個月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體昔榴,經(jīng)...
    沈念sama閱讀 46,469評論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡辛藻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,552評論 3 342
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了互订。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片吱肌。...
    茶點(diǎn)故事閱讀 40,680評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖仰禽,靈堂內(nèi)的尸體忽然破棺而出氮墨,到底是詐尸還是另有隱情纺蛆,我是刑警寧澤,帶...
    沈念sama閱讀 36,362評論 5 351
  • 正文 年R本政府宣布规揪,位于F島的核電站桥氏,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏猛铅。R本人自食惡果不足惜字支,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 42,037評論 3 335
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望奸忽。 院中可真熱鬧堕伪,春花似錦、人聲如沸栗菜。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,519評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽苛萎。三九已至桨昙,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間腌歉,已是汗流浹背蛙酪。 一陣腳步聲響...
    開封第一講書人閱讀 33,621評論 1 274
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留翘盖,地道東北人桂塞。 一個月前我還...
    沈念sama閱讀 49,099評論 3 378
  • 正文 我出身青樓,卻偏偏與公主長得像馍驯,于是被迫代替她去往敵國和親阁危。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,691評論 2 361

推薦閱讀更多精彩內(nèi)容

  • Android的廣播機(jī)制方便了開發(fā)者接收系統(tǒng)及其他APP發(fā)送的廣播(開機(jī)汰瘫,電池電量改變等狂打,那么如何自定義一個廣播呢...
    小賤嘎嘎閱讀 584評論 0 0
  • 現(xiàn)實(shí)中的廣播:電臺為了傳達(dá)一些消息而發(fā)送廣播,通過廣播攜帶要傳達(dá)的消息混弥,群眾只要買一個收音機(jī)趴乡,就可以收到廣播了。 ...
    stevewang閱讀 4,245評論 0 8
  • 廣播接收者(BroadcastReceiver) 1.定義廣播接受者 靜態(tài)注冊廣播 定義類繼承BroadcastR...
    ProZoom閱讀 2,240評論 2 4
  • BroadcastReceiver作為Android四大組件之一蝗拿,在Android日常開發(fā)中有著不可或缺的作用晾捏,主...
    陜E_沙僧閱讀 1,680評論 0 1
  • 定義: 是一個全局監(jiān)聽器,屬于Android四大組件之一 廣播分為兩個角色:廣播發(fā)送者,廣播接收者 廣播接收器分為...
    LiuZhanYue閱讀 508評論 0 0