android broadcast使用總結分享

Brodcast Recevier(廣播接收器)用於異步接收廣播Intent

11、廣播接收器是一個專注於接收廣播通知信息,並做出對應處理的組件。很多廣播是源自於系統代碼的──比如,通知時區改變、電池電量低、拍攝了一張照片或者用戶改變了語言選項。應用程序也可以進行廣播──比如說,通知其它應用程序一些數據下載完成並處於可用狀態。
2、應用程序可以擁有任意數量的廣播接收器以對所有它感興趣的通知信息予以響應。所有的接收器均繼承自BroadcastReceiver基類。
3、廣播接收器沒有用戶界面。然而,它們可以啓動一個activity來響應它們收到的信息,或者用NotificationManager來通知用戶。通知可以用很多種方式來吸引用戶的注意力──閃動背燈、震動、播放聲音等等。一般來說是在狀態欄上放一個持久的圖標,用戶可以打開它並獲取消息。

2)廣播接收者的註冊有兩種方法,分別是程序動態註冊和AndroidManifest文件中進行靜態註冊

<receiver android:name="MyReceiver">//靜態註冊
    <intent-filter>

<action> //過濾作用,接收指定的action廣播
        <action android:name="com.android.broadcast.RECEIVER_ACTION"/>//指定的action廣播
    </intent-filter>
</receiver>

 

動態方式, 在activity裏面調用函數來註冊一個形參是receiver,另一個IntentFilter,其中裏面是要接收的action。

protected static final String ACTION "com.android.broadcast.RECEIVER_ACTION";//定義一個ACTION

IntentFilter filter=new IntentFilter();
filter.addAction(ACTION );////指定action,使之用於接收同action的廣播
registerReceiver(receiverfilter);//發送廣播

3)動態註冊廣播接收器特點是當用來註冊的Activity關掉後,廣播也就失效了。靜態註冊無需擔憂廣播接收器是否被關閉,只要設備是開啓狀態,廣播接收器也是打開着的。也就是說哪怕app本身未啓動,該app訂閱的廣播在觸發時也會對它起作用。

主要有兩大類,用於接收廣播的:
  ·正常廣播 Normal broadcasts(用 Context.sendBroadcast()發送)是完全異步的。它們都運行在一個未定義的順序,通常是在同一時間。這樣會更有效,但意味着receiver不能包含所要使用的結果或中止的API。
  ·有序廣播 Ordered broadcasts(用 Context.sendOrderedBroadcast()發送)每次被髮送到一個receiver。所謂有序,就是每個receiver執行後可以傳播到下一個receiver,也可以完全中止傳播--不傳播給其他receiver。 而receiver運行的順序可以通過matched intent-filter 裏面的android:priority來控制,數越大優先級別越高,取值範圍爲-1000-1000,當priority優先級相同的時候,Receiver以任意的順序運行。

優先級高的可以setResultExtras(Bundle)方法將處理結果存入Broadcast中,然後傳給下一個接收者,下一個接收者通過代碼: Bundle bundle=getResultExtras(true)可以獲取上一個接收者存入的數據。

創建兩個Receiver MyReceiver2優先級大於MyReceiver1

<receiver android:name=".MyReceiver1">
      <intent-filter android:priority="200">

      </action></intent-filter>
   </receiver>
 <receiver android:name=".MyReceiver2">
  <intent-filter android:priority="1000">

  </action></intent-filter>
</receiver>

 

 

爲了避免系統超載,只能一次運行一個receiver。

 

生命週期
  一個BroadcastReceiver 對象只有在被調用onReceive(Context, Intent)的纔有效的,當從該函數返回後,該對象就無效的了,結束生命週期。
因此從這個特徵可以看出,在所調用的onReceive(Context, Intent)函數裏,不能有過於耗時的操作,不能使用線程來執行。對於耗時的操作,請start service來完成。因爲當得到其他異步操作所返回的結果時,BroadcastReceiver 可能已經無效了。onReceive中代碼的執行時間不要超過5s,否則Android會彈出超時dialog。
發送廣播
事件的廣播比較簡單,構建Intent對象,可調用sendBroadcast(Intent)方法將廣播發出。另外還有sendOrderedBroadcast(),sendStickyBroadcast()等方法

1. Intent intent = new Intent(String action)
2.set data等準備好了後,in activity,
sendBroadcast(Intent); // 發送廣播

//定義action常量
protected static final String ACTION "com.android.broadcast.RECEIVER_ACTION";

//實例化Intent
Intent intent=new Intent();
//設置Intent的action屬性
intent.setAction(ACTION);
//發出廣播
sendBroadcast(intent);


接收廣播
通過定義一個繼承BroadcastReceiver類來實現,繼承該類後覆蓋其onReceiver方法,並在該方法中響應事件。

public class MyReceiver extends BroadcastReceiver{
    //定義日誌標籤
    private static final String TAG "Test";
    @Override
    public void onReceive(Context contextIntent intent){
        //輸出日誌信息
        Log.i(TAG"MyReceiver onReceive--->");

    }

 

註銷廣播

 

//註銷BroadcastReceiver
unregisterReceiver(receiver);

 

一個receiver可以接收多個action的,即可以有多個intent-filter,需要在onReceive裏面對intent.getAction(action name)進行判斷。

而且動態註冊,需要特別注意的是,在退出程序前要記得調用Context.unregisterReceiver()方法。一般在activity的onStart()裏面進行註冊, onStop()裏面進行註銷。官方提醒,如果在Activity.onResume()裏面註冊了,就必須在Activity.onPause()註銷。
Permission權限
  要接收某些action,需要在AndroidManifest.xml裏面添加相應的permission。例如接收SMS:

<uses-permission android:name="android.permission.RECEIVE_SMS" />

 

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