android四大組件之Broadcast,androidbroadcast

來源:互聯網
上載者:User

android四大組件之Broadcast,androidbroadcast

  • 廣播的概念
    • 現實中:我們常常使用電台通過發送廣播發布訊息,買個收音機,就能收聽
    • Android:系統在產生某個事件時發送廣播,應用程式使用廣播接收者接收這個廣播,就知道系統產生了什麼事件。Android系統在啟動並執行過程中,會產生很多事件,比如開機、電量改變、收發簡訊、撥打到電話、螢幕解鎖
  • 廣播接收者的註冊

    Android四大組件都要在資訊清單檔中註冊

    廣播接收者比較特殊,既可以在資訊清單檔中註冊,也可以直接使用代碼註冊

    有的廣播接收者,必須代碼註冊如 電量改變,螢幕鎖屏和解鎖

    • 使用資訊清單檔配置

      <receiver android:name="接收廣播的實作類別所在的包">    <intnt-filter>        <android:name="要接收的廣播">        <android:data="">        ......    </intent-filter></receiver>
    • 通過代碼的實現

      //建立廣播接收者對象receiver = new ScreenOnOffReceiver();//通過IntentFilter對象指定廣播接收者接收什麼類型的廣播IntentFilter filter = new IntentFilter();filter.addAction(Intent.ACTION_SCREEN_OFF);filter.addAction(Intent.ACTION_SCREEN_ON);//註冊廣播接收者registerReceiver(receiver, filter);
    • 解除註冊廣播接收者 解除註冊之後,廣播接收者將失去作用

      unregisterReceiver(receiver);
    • 為什麼
  • 廣播的接收

    在Android中,Broadcast是一種廣泛運用的在應用程式之間傳輸資訊的機制。而BroadcastReceiver是對發送出來的Broadcast進行過濾接受並響應的一類組件。廣播接收者(BroadcastReceiver)用於接收廣播Intent的, 廣播Intent的發送是通過調用sendBroadcast/sendOrderedBroadcast來實現的。通常一個廣播Intent可以被訂閱了此Intent的多個廣播接收者所接收。
  • 實現一個BroadcastReceiver 接收BroadCast發送的廣播

    需求:監聽使用者撥打到電話,在使用者撥打到電話號碼前自動加上17951等

    攔截的廣播:

    <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>

    需要的許可權:

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

    1.新建立一個Android工程《IPCaller》

    2.在src目錄下新建立一個類IPCallerReceiver繼承BroadcastReceiver,重寫OnReceive方法。

    public class IPCallReveiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {    //擷取撥打的電話號碼    String resultData = getResultData();    //在電話號碼前加上17951,然後返回資料    setResultData("17951"+resultData);    }}

    3.在AndroidManifest.xml中註冊廣播接收者

    <receiver android:name="com.itheima.ipcaller.IPCallReveiver">    <intent-filter android:priority="1000">        <action android:name="android.intent.action.NEW_OUTGOING_CALL"></action>    </intent-filter></receiver>

    在下面的設定檔中 <intent-filter android:priority="1000">屬性代表著給當前接收者設定優先權,優先順序越高越優先接收到廣播(只有有序廣播註冊才有效)

    運行上面的代碼,然後撥打到電話5556,發現撥出去的號碼已經變為179515556。 運行如下:

  • 發送自訂廣播

    • 發送無序廣播

      • 無序廣播不可以被攔截,如果被攔截的話會報錯:
      • 無序廣播可以視為所有廣播接收者同時接收到廣播
      • 無序廣播使用sendBroadcast方法來發送

        public void sendBroadcast(View view){    //定義一個意圖    Intent intent = new Intent();    //設定Action 可以接受到該廣播的意圖過濾器    intent.setAction("com.itheima.broadcast");    //綁定資料    intent.putExtra("data", "我是無序廣播資料");    //發送無序廣播    sendBroadcast(intent);}
    • 發送有序廣播

      • 有序廣播可以被攔截,且優先順序搞得接收者可以攔截優先順序低的
      • 廣播接受者的優先順序的取值範圍是:1000(最高)~ -1000(最低)
      • 相同的優先順序下,接收的順序要看資訊清單檔中的聲明順序,先聲明先接收廣播
      • 有序廣播使用sendOrderedBroadcast()方法發送,可以使用abortBroadcast()方法攔截 *廣播接收者的優先順序可以在資訊清單檔中聲明接收者時,在<intent-filter>標籤下通過設定“android:property”屬性來設定

      我們新建立一個項目,來示範無序廣播的發送和接收過程

      2.在預設的MainActivity的布局中添加一個按鈕,綁定事件,該事件的核心功能是發送一個有序廣播,MainActivity類代碼清單如下:

      public class MainActivity extends Activity {    @Override    protected void onCreate(Bundle savedInstanceState) {    super.onCreate(savedInstanceState);    setContentView(R.layout.activity_main);}public void sendOrder(View view) {    // 意圖    Intent intent = new Intent();    //定義動作    intent.setAction("com.itheima.data");    //發送有序廣播    //第一個參數 Intent類型:意圖    //第二個參數 String類型 receiverPermission,接收器需要的許可權    //第三個參數BroadcastReceiver類型,自己定義的接收器作為最終接收器    //第四個參數Handler類型,用於執行接收器的回調,如果為null則在主線程中執行    //第五個參數int類型,結果代碼的初始碼    //第六個參數初始化參數    //第七個參數Bundle類型,額外的資料    sendOrderedBroadcast(intent, null, null,    null, RESULT_OK, "1萬元錢", null);}

      3.分別編寫MyReceiver和MyReceiver2類,繼承BroadcastReceiver類

      MyReceiver類代碼清單:

      public class MyReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        String resultData = getResultData();        Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show();        System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData);    }}

      MyReceiver2類代碼清單:

      public class MyReceiver2 extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        String action = intent.getAction();        String resultData = getResultData();        Toast.makeText(context, "MyReceiver2接收到"+action+"發布的廣播:"+resultData, 1).show();        System.out.println("MyReceiver2接收到"+action+"發布的廣播:"+resultData);    }}

      4.在AndroidManifest.xml中註冊MyReceiver和MyReceiver2:

      <receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver">    <intent-filter android:priority="1000">     <action android:name="com.itheima.data"></action>    </intent-filter></receiver><receiver android:name="com.itheima.broadcastAndreceiver.MyReceiver2">    <intent-filter android:priority="-1000">        <action android:name="com.itheima.data"></action>    </intent-filter></receiver>

      在上面資訊清單檔中我們給MyReceiver設定了最高優先順序1000,給MyReceiver2設定了最低優先順序-1000。

      5.下面我們分多鐘情況,分別示範有序廣播的接收規律

      直接部署上面的工程到模擬器,點擊發送廣播按鈕,控制台結果為:

      6.修改MyReceiver類的代碼:在onReceive方法中添加abortBroadcast()方法,

      public class MyReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {    String action = intent.getAction();    String resultData = getResultData();    Toast.makeText(context, "MyReceiver接收到"+action+"發布的廣播:"+resultData, 1).show();    System.out.println("MyReceiver接收到"+action+"發布的廣播:"+resultData);    abortBroadcast();    }}

      然重新部署該工程,運行,點擊發送廣播按鈕。這時控制台列印資訊為

      這說明優先順序高的的廣播接收者可以修改或攔截廣播 優先順序低的廣播接收者收到修改後的廣播或收不到廣播

      7.在第二種情況的基礎上,我們修改MainActivity類中sendOrder方法,修改sendOrderedBroadcast中第三個參數,指定一個最終接收器

      public void sendOrder(View view) {    // 意圖    Intent intent = new Intent();    intent.setAction("com.itheima.data");    sendOrderedBroadcast(intent, null, new MyReceiver2(),    null, RESULT_OK, "1萬元錢", null);}

      運行上面的項目,我們可以控制台輸出如下資訊:

      雖然在MyReceiver中我們調用了abortBroadcast();方法,但是廣播依然被MyReceiver2接收到。原因是我們在sendOrderedBroadcast方法中指定了MyReceiver2接收器為最終接收器,因此該廣播被終止的時候MyReceiver2接收器依然可以接收到廣播。

      8.在第3種情形的基礎上,我們修改MyReceiver類,我們將該類中的onReceive方法中的abortBroadcast();方法去掉。然後運行上面工程。發現控制台輸入如下資訊

      我們發現MyReceiver第一個接收到廣播,MyReceiver2第二個接收到廣播,然後MyReceiver2又接收到一次廣播。對的,結果確實是這樣,因為我們在sendOrderedBroadcast方法中,將MyReceiver2作為最終接收器,那麼我們發出的廣播會被所有合格接收器接收,最後指定的最終接收器不管是否已經接收過資訊依然會再次接收。

 

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.