Android開發學習—— Broadcast廣播接收者

来源:http://www.cnblogs.com/mengxiao/archive/2016/12/23/6214724.html
-Advertisement-
Play Games

現實中:電臺要發佈消息,通過廣播把消息廣播出去,使用收音機,就可以收聽廣播,得知這條消息。Android中:系統在運行過程中,會產生許多事件,那麼某些事件產生時,比如:電量改變、收發簡訊、撥打電話、屏幕解鎖、開機,系統會發送廣播。 只要應用程式接收到這條廣播,就知道系統發生了相應的事件,從而執行相應 ...


現實中:電臺要發佈消息,通過廣播把消息廣播出去,使用收音機,就可以收聽廣播,得知這條消息。
Android中:系統在運行過程中,會產生許多事件,那麼某些事件產生時,比如:電量改變、收發簡訊、撥打電話、屏幕解鎖、開機,系統會發送廣播。

                  只要應用程式接收到這條廣播,就知道系統發生了相應的事件,從而執行相應的代碼。使用廣播接收者,就可以收聽廣播。


                  系統中任何應用只要註冊了對應了Receiver,就會接收到此Broadcast。

 

###創建廣播接收者
1. 定義java類繼承BroadcastReceiver
2. 在清單文件中定義receiver節點,定義name屬性,指定廣播接收者java類的全類名
3.intent-filter的節點中,指定action子節點,action的值必須跟要接受的廣播中的action匹配,比如,如果要接受打電話廣播,
那麼action的值必須指定為
        <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
* 因為打電話廣播中所包含的action,就是"android.intent.action.NEW_OUTGOING_CALL",所以我們定義廣播接收者時,
  action必須與其匹配,才能收到這條廣播
* 即便廣播接收者所在進程已經被關閉,當系統發出的廣播中的action跟該廣播接收者的action匹配時,系統會啟動該廣播接收者所在的進程,
  並把廣播發給該廣播接收者。

 使用服務註冊廣播接收者
* Android四大組件都要在清單文件中註冊
* 廣播接收者比較特殊,既可以在清單文件中註冊,也可以直接使用代碼註冊
* 有的廣播接收者,必須代碼註冊
    * 電量改變
    * 屏幕鎖屏和解鎖

* 註冊廣播接收者

        //創建廣播接收者對象
        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);
* 解除註冊之後,廣播接收者將失去作用

小案例:

#IP撥號器
> 原理:接收撥打電話的廣播,修改廣播內攜帶的電話號碼
* 定義廣播接收者接收打電話廣播
    public class CallReceiver extends BroadcastReceiver {
        //當廣播接收者接收到廣播時,此方法會調用
        @Override
        public void onReceive(Context context, Intent intent) {
            //拿到用戶撥打的號碼
            String number = getResultData();
            //修改廣播內的號碼
            setResultData("17951" + number);
        }
    }
* 在清單文件中定義該廣播接收者接收的廣播類型

        <receiver android:name="com.itheima.ipdialer.CallReceiver">
            <intent-filter >
                <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
            </intent-filter>
        </receiver>
* 接收打電話廣播需要許可權

        <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
* 即使廣播接收者的進程沒有啟動,當系統發送的廣播可以被該接收者接收時,系統會自動啟動該接收者所在的進程。

 

#簡訊攔截器
>系統收到簡訊時會產生一條廣播,廣播中包含了簡訊的號碼和內容

* 系統發送簡訊廣播時,是怎麼把簡訊內容存入廣播的,我們就只能怎麼取出來
* 如果簡訊過長,那麼發送時會拆分成多條簡訊發送,那麼簡訊廣播中就會包含多條簡訊
* 定義廣播接收者接收簡訊廣播
        public void onReceive(Context context, Intent intent) {
        //拿到廣播里攜帶的簡訊內容
        Bundle bundle = intent.getExtras();
        Object[] objects = (Object[]) bundle.get("pdus");
        for(Object ob : objects ){
            //通過object對象創建一個簡訊對象
            SmsMessage sms = SmsMessage.createFromPdu((byte[])ob);
            System.out.println(sms.getMessageBody());
            System.out.println(sms.getOriginatingAddress());
        }
    }
* 系統創建廣播時,把簡訊存放到一個數組,然後把數據以pdus為key存入bundle,再把bundle存入intent
* 清單文件中配置廣播接收者接收的廣播類型,註意要設置優先順序屬性,要保證優先順序高於簡訊應用,才可以實現攔截
        <receiver android:name="com.itheima.smslistener.SmsReceiver">
            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
            </intent-filter>
        </receiver>
* 添加許可權
        <uses-permission android:name="android.permission.RECEIVE_SMS"/>
* 4.0以後廣播接收者安裝以後必須手動啟動一次,否則不生效
* 4.0以後廣播接收者如果被手動關閉,就不會再啟動了

 

#監聽SD卡狀態
* 清單文件中定義廣播接收者接收的類型,監聽SD卡常見的三種狀態,所以廣播接收者需要接收三種廣播
         <receiver android:name="com.itheima.sdcradlistener.SDCardReceiver">
            <intent-filter >
                <action android:name="android.intent.action.MEDIA_MOUNTED"/>
                <action android:name="android.intent.action.MEDIA_UNMOUNTED"/>
                <action android:name="android.intent.action.MEDIA_REMOVED"/>
                <data android:scheme="file"/>
            </intent-filter>
        </receiver>
* 廣播接收者的定義

        public class SDCardReceiver extends BroadcastReceiver {
            @Override
            public void onReceive(Context context, Intent intent) {
                // 區分接收到的是哪個廣播
                String action = intent.getAction();
                    
                if(action.equals("android.intent.action.MEDIA_MOUNTED")){
                    System.out.println("sd卡就緒");
                }
                else if(action.equals("android.intent.action.MEDIA_UNMOUNTED")){
                    System.out.println("sd卡被移除");
                }
                else if(action.equals("android.intent.action.MEDIA_REMOVED")){
                    System.out.println("sd卡被拔出");
                }
            }
        }

 


#勒索軟體
* 接收開機廣播,在廣播接收者中啟動勒索的Activity
* 清單文件中配置接收開機廣播

        <receiver android:name="com.itheima.lesuo.BootReceiver">
            <intent-filter >
                <action android:name="android.intent.action.BOOT_COMPLETED"/>
            </intent-filter>
        </receiver>
* 許可權

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

* 定義廣播接收者

        @Override
        public void onReceive(Context context, Intent intent) {
            //開機的時候就啟動勒索軟體
            Intent it = new Intent(context, MainActivity.class);        
            context.startActivity(it);
        }
* 以上代碼還不能啟動MainActivity,因為廣播接收者的啟動,並不會創建任務棧,那麼沒有任務棧,就無法啟動activity
* 手動設置創建新任務棧的flag

        it.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);


#監聽應用的安裝、卸載、更新
> 原理:應用在安裝卸載更新時,系統會發送廣播,廣播里會攜帶應用的包名
* 清單文件定義廣播接收者接收的類型,因為要監聽應用的三個動作,所以需要接收三種廣播

        <receiver android:name="com.itheima.app.AppReceiver">
            <intent-filter >
                <action android:name="android.intent.action.PACKAGE_ADDED"/>
                <action android:name="android.intent.action.PACKAGE_REPLACED"/>
                <action android:name="android.intent.action.PACKAGE_REMOVED"/>
                <data android:scheme="package"/>
            </intent-filter>
        </receiver>
* 廣播接收者的定義

        public void onReceive(Context context, Intent intent) {
            //區分接收到的是哪種廣播
            String action = intent.getAction();
            //獲取廣播中包含的應用包名
            Uri uri = intent.getData();
            if(action.equals("android.intent.action.PACKAGE_ADDED")){
                System.out.println(uri + "被安裝了");
            }
            else if(action.equals("android.intent.action.PACKAGE_REPLACED")){
                System.out.println(uri + "被更新了");
            }
            else if(action.equals("android.intent.action.PACKAGE_REMOVED")){
                System.out.println(uri + "被卸載了");
            }
        }

 

#廣播的兩種類型
* 無序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播,並且是沒有先後順序(同時收到)
* 有序廣播:所有跟廣播的intent匹配的廣播接收者都可以收到該廣播,但是會按照廣播接收者的優先順序來決定接收的先後順序
    * 優先順序的定義:-1000~1000
    * 最終接收者:所有廣播接收者都接收到廣播之後,它才接收,並且一定會接收
    * abortBroadCast:阻止其他接收者接收這條廣播,類似攔截,只有有序廣播可以被攔截


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

-Advertisement-
Play Games
更多相關文章
  • 體驗效果:http://hovertree.com/texiao/css3/39/這是一個使用純CSS3實現的圖文切換效果,沒使用js腳本。點擊左右箭頭或者索圓點引按鈕可以切換內容。本特效中使用到了CSS3的新選擇器 nth-of-type(n),:nth-of-type(n) 選擇器匹配屬於父元素 ...
  • 一、行內元素水平居中 text-align: center; 二、行內元素垂直居中 height: 40px;line-height: 40px; 讓這兩個值相等 三、塊級元素水平居中 width: 300px; margin: 0 auto; 可以不設置高度 三、塊級元素垂直居中 1.固定寬高塊級 ...
  • 對象屬性: 1、private修飾的屬性:只能在本類內部訪問,分類和外部都不能訪問(徹底私有) 2、fileprivate修飾的屬性:在本類和分類中可以訪問,外部不能訪問(部分私有) 3、直接用let或var修飾的屬性:在本類、分類和外部都可以訪問(開放) 4、在分類中只能聲明計算屬性,不能聲明存儲 ...
  • 在Android3.0之後,Google對UI導航設計上進行了一系列的改革,其中有一個非常好用的新功能就是引入的ActionBar,他用於取代3.0之前的標題欄,並提供更為豐富的導航效果。ActionBar的主要目的是: 1.提供一個用於識別應用程式的標示和用戶的位置的專用空間。 2.在不同的應用程 ...
  • 一直不懂別人口中說的原生開發、混合式開發。今天突然看了一篇文章講解的是什麼叫做原生App?移動 Web App?混合APP?分享給大家。 原生App是專門針對某一類移動設備而生的,它們都是直接安裝到設備里,而用戶一般也是通過網路商店或者賣場來獲取例如 The App Store與Android Ap ...
  • 1、到github網址上下載zip壓縮包https://github.com/danielgindi/Charts 2、然後將解壓後的文件夾整個拖到自己的工程文件夾下(很多教程只讓拖xcodeproj文件,但我拖了不好使),如下圖: 3、然後用xcode打開工程,將剛纔拖進去的Charts-mast ...
  • access_token分兩種 access_token就是一種許可權集合的含義. ...
  • 直接看代碼吧!!! ...
一周排行
    -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.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...