android廣播機制---BroadcastReceiver
阿新 • • 發佈:2022-03-13
- Android中的廣播主要可以分為兩種型別:標準廣播和有序廣播
- 標準廣播是一種完全非同步執行的廣播,在廣播發出之後,所有的
BroadcastReceiver幾乎會在同一時刻收到這條廣播訊息它們之間沒有任何先後順
序可言。這種廣播的效率會比較高 - 有序廣播則是一種同步執行的廣播,在廣播發出之後,同一時刻只會有一個BroadcastReceive能夠收到這條廣播訊息,當這個BroadcastReceiver中的邏輯執行完畢後,廣播才會繼續傳遞。所以此時的BroadcastReceiver是有先後順序的,優先順序高的BroadcastReceiver就可以先收到廣播訊息,並且前面的BroadcastReceiver還可以截斷正在傳遞的廣播
- 接受系統廣播
- Android內建了很多系統級別的廣播,我們可以在應用程式中通過監聽這些廣播來得到各種系統的狀態資訊。比如手機開機完成後會發出一條廣播,電池的電量發生變化會發出一條廣播,系統時間發生改變也會發出一條廣播,等等。
- 使用BroadcastReceiver接受時間變化廣播
- 建立BroadcastReceiver的子類
並重寫了父類的onReceive()方法。這樣每當系統時間發生變化
時,onReceive()方法就會得到執行
onCreate()方法,首先我們建立了一個IntentFilter的例項,並給它添加了一個
值為android.intent.action.TIME_TICK的action,為什麼要新增這個值呢?因為當系統
時間發生變化時,系統發出的正是一條值為android.intent.action.TIME_TICK的廣播,
也就是說我們的BroadcastReceiver想要監聽什麼廣播,就在這裡新增相應的action。接下來建立了一個TimeChangeReceiver的例項,然後呼叫registerReceiver()方法進行注
冊,將TimeChangeReceiver的例項和IntentFilter的例項都傳了進去,這樣TimeChangeReceiver就會收到所有值為android.intent.action.TIME_TICK的廣播,也就實現了監聽系統時間變化的功能。最後要記得,動態註冊的BroadcastReceiver一定要取消注才行,這裡我們是在onDestroy()方法中通過呼叫unregisterReceiver()方法來實現的。
- 靜態註冊廣播
由於大量惡意的應用程式利用這個機制在程式未啟動的情況
下監聽系統廣播,從而使任何應用都可以頻繁地從後臺被喚醒,嚴重影響了使用者手機的電量和
效能,因此Android系統幾乎每個版本都在削減靜態註冊BroadcastReceiver的功能。在Android 8.0系統之後,所有隱式廣播都不允許使用靜態註冊的方式來接收了。隱式廣播指的
是那些沒有具體指定傳送給哪個應用程式的廣播,大多數系統廣播屬於隱式廣播,但是少數特
殊的系統廣播目前仍然允許使用靜態註冊的方式來接收。
- 在開機的時候,我們的應用程式肯定是沒有啟動的,不能使用動態廣播
單獨建立一個BroadcastReceiver的子類
靜態的BroadcastReceiver一定要在AndroidManifest.xml檔案中註冊才可以使用
此處將BootCompleteReceiver與廣播進行關聯,這樣開機發出廣播,應用就能接收到