Android BroadcastReceiver簡介

1. BroadcastReceiver類

BroadcastReceiver用來接收廣播,並在onReceive(Context, Intent)方法裏面處理廣播。

public class DemoBroadcastReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

    }

}

2. 註冊廣播

  • 靜態註冊

    靜態註冊需要在AndroidMainFest.xml文件中添加receiver標籤。

      <receiver android:name=".component.receiver.DemoBroadcastReceiver">
          <intent-filter>
              <action android:name="com.blog.demo.action.receiver" />
          </intent-filter>
      </receiver>
    
  • 動態註冊

    動態註冊需要在Activity中調用registerReceiver(BroadcastReceiver, IntentFilter)方法

      IntentFilter intentFilter = new IntentFilter("com.blog.demo.action.receiver");
      registerReceiver(mReceiver, intentFilter);
    

3. 發送廣播

通過sendBroadcast(Intent)發送廣播

Intent intent = new Intent("com.blog.demo.action.receiver");
intent.putExtra("value", "broadcast");
sendBroadcast(intent);

通過sendOrderedBroadcast(Intent, String)發送有序廣播

Intent intent = new Intent("com.blog.demo.action.receiver");
intent.putExtra("value", "broadcast");
sendOrderedBroadcast(intent, null);
  • 發送出去的廣播被廣播接收者按照先後順序接收
  • 廣播接受者按照Priority屬性值從大到小排序,Priority屬性值相同時,動態註冊先於靜態註冊
  • 先接收的廣播接收者可以對廣播進行截斷,即後接收的廣播接收者不再接收到此廣播,調用abortBroadcast()方法
  • 先接收的廣播接收者可以對廣播進行修改,那麼後接收的廣播接收者將接收到被修改後的廣播

Priority屬性值的範圍是-1000~1000,靜態註冊的可以在AndroidMainFest.xml文件中配置

<receiver android:name=".component.receiver.DemoBroadcastReceiver">
    <intent-filter android:priority="1000">
        <action android:name="com.blog.demo.action.receiver" />
    </intent-filter>
</receiver>

動態註冊則通過setPriority(int)修改

IntentFilter intentFilter = new IntentFilter("com.blog.demo.action.receiver");
intentFilter.setPriority(500);
registerReceiver(mReceiver, intentFilter);

4. 本地廣播

Android中的廣播可以跨App直接通信,存在有數據安全的問題。使用本地廣播,只能在本地應用程序中發送與接收廣播,可以起到保護數據安全的作用。

  • 可以在註冊廣播時將exported屬性設置爲false,在廣播發送和接收時,增設相應權限permission,用於權限驗證。

  • 也可以使用LocalBroadcastManager

      LocalBroadcastManager mLocalBroadcastManager = LocalBroadcastManager.getInstance(this);
    
      // 註冊
      IntentFilter intentFilter = new IntentFilter("com.blog.demo.action.receiver");
      intentFilter.setPriority(500);
      mLocalBroadcastManager.registerReceiver(mReceiver, intentFilter);
    
      // 註銷
      mLocalBroadcastManager.unregisterReceiver(mReceiver);
    

5. 常用系統廣播

系統操作 action
監聽網絡變化 android.net.conn.CONNECTIVITY_CHANGE
關閉或打開飛行模式 Intent.ACTION_AIRPLANE_MODE_CHANGED
充電時或電量發生變化 Intent.ACTION_BATTERY_CHANGED
電池電量低 Intent.ACTION_BATTERY_LOW
電池電量充足(即從電量低變化到飽滿時會發出廣播) Intent.ACTION_BATTERY_OKAY
系統啓動完成後(僅廣播一次) Intent.ACTION_BOOT_COMPLETED
按下照相時的拍照按鍵(硬件按鍵)時 Intent.ACTION_CAMERA_BUTTON
屏幕鎖屏 Intent.ACTION_CLOSE_SYSTEM_DIALOGS
設備當前設置被改變時(界面語言、設備方向等) Intent.ACTION_CONFIGURATION_CHANGED
插入耳機時 Intent.ACTION_HEADSET_PLUG
未正確移除SD卡但已取出來時(正確移除方法:設置–SD卡和設備內存–卸載SD卡) Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部儲存裝置(如SD卡) Intent.ACTION_MEDIA_CHECKING
成功安裝APK Intent.ACTION_PACKAGE_ADDED
成功刪除APK Intent.ACTION_PACKAGE_REMOVED
重啓設備 Intent.ACTION_REBOOT
屏幕被關閉 Intent.ACTION_SCREEN_OFF
屏幕被打開 Intent.ACTION_SCREEN_ON
關閉系統時 Intent.ACTION_SHUTDOWN

參考資料: https://www.jianshu.com/p/ca3d87a4cdf3

相關文章
Android Activity簡介
Android Service簡介
Android ContentProvider簡介
Android BroadcastReceiver簡介

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章