Android學習筆記(4)

myxs發表於2017-03-25

Broadcast

標籤: Android


1、廣播機制

應用程式可以傳送和接收廣播。傳送廣播利用到Intent,接收廣播利用到廣播接收器(Braodcast Receiver)。程式需要對某些廣播進行註冊來接收廣播內容。

廣播有2種

  • 標準廣播:所有廣播接收器可以同時接收
  • 有序廣播:會根據廣播接收器的優先順序高低確認先後順序,可能會導致截斷

2、接收系統廣播

系統的狀態發生變化時,比如開機、電量變化和時間改變等都會發出廣播,而程式只有使用廣播接收器才能接受到這些廣播

接受廣播具體用法

  1. 廣播接收器對某些廣播進行註冊。有2種方式註冊,程式碼中動態註冊和AndroidManifest.xml靜態註冊。
  2. 建立一個廣播接收器類。新建一個類繼承BraodcastReceiver,並重寫onReceive方法。有廣播發出時,onReceive方法執行
  3. 在活動的onCreate方法中通過IntentFilter指定想要監聽的廣播型別

    IntentFilter intentFilter = new IntentFilter();
    intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
    XXXBroadcastReceiver broadcastReceiver = new XXXBroadcastReceiver();//廣播接收器例項
    registerReceiver(broadcastReceiver, intentFilter);//動態註冊,引數為廣播接收器和IntentFilter
    
  4. 動態註冊的廣播接收器需要在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,直接傳送廣播即可,廣播接收器的相關處理已經完成。

相關文章