android四大組件之Broadcast

来源:http://www.cnblogs.com/ideal-iover/archive/2016/03/26/5324327.html
-Advertisement-
Play Games

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


  • 廣播的概念
    • 現實中:我們常常使用電臺通過發送廣播發佈消息,買個收音機,就能收聽
    • 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”屬性來設置

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

      1. 新創建一個Android工程《廣播發送和接收》,包名com.itheima.broadcastAndreceiver

      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作為最終接收器,那麼我們發出的廣播會被所有符合條件的接收器接收,最後指定的最終接收器不管是否已經接收過信息依然會再次接收。

 


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 在現在這個離不開手機的時代,對於手機APP的開發也是一個很大的市場,所以自己也想去探一探手機APP開發,在我們進行Android開發的第一步就是搭建環境,具體怎麼搭建我就不說,這裡記錄一下在搭建環境的過程中遇到的一些問題,來幫助遇到相同問題的童鞋。 1、點擊安卓模擬器就會出現一個錯誤消息:Locat ...
  • 一、概述 Xfermode全名transfer-mode,其作用是實現兩張圖疊加時的混合效果。 網上流傳的關於Xfermode最出名的圖來源於AndroidSDK的samples中,名叫Xfermodes.java,效果如下: [轉載請保留本文地址:http://www.cnblogs.com/go ...
  • 工具類 Activity ...
  • 這是深入淺出React Native教程的第二篇文章。 1. 環境配置 React Native環境配好之後,就可以開始創建我們的第一個App啦。 打開控制台,輸入 上述命令的作用是在當前文件夾下創建一個名字叫AwesomeProject的項目模板。在運行該命令之前,可以先用cd命令到自己想創建re ...
  • 一首先下載Jar包 https://github.com/square/okhttp 如果使用android studio只需要加入依賴 二--下載一張圖片並顯示 使用的是hanlder的方式 也可以把網路請求寫為一個工具類, get方式 ...
  • 展示效果如下: 大家可以看到這個界面很簡單,其實就是UITableView的佈局, 但是難點是在於如何從網上下載這些圖片,下載之後應如何進行存儲! 我們一步一步進行解析,先從單線程(主線程)進行多圖片下載 我們佈局上的文字及圖片的地址從plist文件中進行讀取 根據結構,我們自定義一個數據模型文件 ...
  • 今天在寫項目的時候,遇到了一件令人抓狂的事情。 正如標題所示,被這個方法弄的團團轉。 -(void)scrollViewDidEndScrollingAnimation:是協議里的方法。 意味當動畫結束時調用。 動畫?為什麼會有動畫呢? setContentOffset: animated: -這一 ...
  • 該教程主要介紹如何用react native來開發iOS,所以首先,你需要有一臺mac,當然黑蘋果也是可以的~ 創建一個react native的項目只需要安裝以下五個組件~~(但....坑爹的是,不翻牆的話安裝慢成狗呀) 1. 安裝 xcode 做過ios相關開發的都知道這個,作為ios開發的首席 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...