Android學習筆記(4)
Broadcast
標籤: Android
1、廣播機制
應用程式可以傳送和接收廣播。傳送廣播利用到Intent,接收廣播利用到廣播接收器(Braodcast Receiver)。程式需要對某些廣播進行註冊來接收廣播內容。
廣播有2種
- 標準廣播:所有廣播接收器可以同時接收
- 有序廣播:會根據廣播接收器的優先順序高低確認先後順序,可能會導致截斷
2、接收系統廣播
系統的狀態發生變化時,比如開機、電量變化和時間改變等都會發出廣播,而程式只有使用廣播接收器才能接受到這些廣播
接受廣播具體用法
- 廣播接收器對某些廣播進行註冊。有2種方式註冊,程式碼中動態註冊和AndroidManifest.xml靜態註冊。
- 建立一個廣播接收器類。新建一個類繼承BraodcastReceiver,並重寫onReceive方法。有廣播發出時,onReceive方法執行
在活動的onCreate方法中通過IntentFilter指定想要監聽的廣播型別
IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); XXXBroadcastReceiver broadcastReceiver = new XXXBroadcastReceiver();//廣播接收器例項 registerReceiver(broadcastReceiver, intentFilter);//動態註冊,引數為廣播接收器和IntentFilter
動態註冊的廣播接收器需要在onDestroy方法中取消註冊。
unregisterReceiver(broadcastReceiver);
動態註冊有一個缺點,必須在程式啟動後才能接收廣播,因為註冊廣播是在onCreate方法中執行的。靜態註冊則避免了
通過AS快速新建廣播接收器,自動註冊。
<Manifest...
<application
...
<receiver
android:name=".XXXRecevier"
... />
<intent-filter>
<action android:name="android.intent.action.XXX" />
</intent-filter>
</receiver>
</application>
</Manifest>
廣播接收器內不能開啟執行緒,所以不能在onReceive方法內有太多的處理邏輯或者耗時操作。
3、傳送全域性自定義廣播
傳送標準廣播
通過Intent傳送自定義廣播,比如可以通過Button的事件來傳送廣播
Intent intent = new Intent("com.example.broadcasttest.MY_BROADCAST");
sendBroadcast(intent);
同時,要有對這條 com.example.broadcasttest.MY_BROADCAST廣播進行註冊的廣播接收器,可以選擇動態或者靜態註冊
<receiver
android:name=".XXXBroadcastReceiver"
... />
<intent-filter>
<action android:name="com.example.broadcasttest.MY_BROADCAST" />
</intent-filter>
</receiver>
傳送有序廣播
新建專案和廣播接收器,並註冊之前的自定義廣播,可以實現一個程式發出的廣播被其它程式的廣播接收器接收到。
有序廣播和標準廣播的程式碼稍微不同
sendOrderedBroadcast(intent, null);
- 有序通過給廣播接收器設定優先順序來實現。
截斷通過在廣播接收器的onReceiver中新增
abortBroadcast();
4、本地廣播
本地廣播和全域性廣播的區別在於範圍不同,當考慮到安全性時,敏感和隱私資料需要得到保護。本地廣播只能在程式內部傳遞,廣播接收器只能接受本地廣播
通過LocalBroadcastManager對廣播進行管理,傳送廣播和註冊廣播接收器。
LocalBraodcastManager localBroadcastManager = LocalBroadcastManager.getInstance(this);
...
Intent intent = new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
localBroadcastManager.sendBroadcast(intent);//傳送廣播
...
//註冊廣播
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
localReceiver = new LocalReceiver();
localBroadcastManager.registerReceiver(localReceiver, intentFilter);
'''
//取消註冊
localBroadcastManager.unregisterReceiver(localReceiver);
...
//廣播接收器
class LocaReceiver extends BroadcastReceiver{
...
}
本地廣播不能靜態註冊。
總結
最後的強制下線:
一個管理所有活動的類,用來對所有活動全部finish;
一個基類作為實現活動新增到類管理中,以及移除,最後還有內部類廣播接收器,在基類中動態註冊和取消廣播。
繼承的子活動類如LoginActivity和MainActivity,直接傳送廣播即可,廣播接收器的相關處理已經完成。
相關文章
- swift學習筆記《4》Swift筆記
- Rails 4 學習筆記AI筆記
- CCNA學習筆記4筆記
- vue學習筆記4Vue筆記
- Java學習筆記4Java筆記
- Android 學習筆記雜記Android筆記
- python學習筆記4Python筆記
- Webpack4學習筆記Web筆記
- p4 學習筆記筆記
- QT學習筆記4(動畫)QT筆記動畫
- 【Go學習筆記4】切片Go筆記
- PL/SQL學習筆記-4SQL筆記
- ruby字串學習筆記4字串筆記
- Android學習筆記·ANRAndroid筆記
- Android學習筆記·HandlerAndroid筆記
- Android SQLite學習筆記AndroidSQLite筆記
- Android學習筆記一Android筆記
- Android學習筆記(6)Android筆記
- Android學習筆記(3)Android筆記
- Android學習筆記(5)Android筆記
- Android學習筆記(2)Android筆記
- Android學習筆記(1)Android筆記
- Android學習筆記(8)Android筆記
- Android學習筆記(7)Android筆記
- Android GC 學習筆記AndroidGC筆記
- android學習筆記--ScannerAndroid筆記
- android學習筆記--AlarmManagerAndroid筆記
- android學習筆記二Android筆記
- android學習筆記三Android筆記
- Android學習筆記四Android筆記
- android學習筆記五Android筆記
- android學習筆記六Android筆記
- Android OpenGL 學習筆記Android筆記
- G01學習筆記-4筆記
- SpringBoot學習筆記(4)Spring Boot筆記
- SpringCloud學習筆記(4)——ZuulSpringGCCloud筆記Zuul
- angular學習筆記(十四)-$watch(4)Angular筆記
- Android Linker學習筆記Android筆記