Android總結六(BroadcastReceiver)

來源:互聯網
上載者:User

標籤:android   style   blog   java   color   使用   

一、接收廣播訊息

  1.什麼是BroadcastReceiver?

    BroadcastReceiver是Android系統四大組件之一,本質上就是一種全域的監聽器,用於監聽系統全域的廣播訊息。

  2.怎樣建立BroadcastReceiver?

    1)建立一個類繼承自BroadcastReceiver類;

    2)在AndroidManifest.xml配置<receiver>節點資訊。

  3.一旦實現了BroadcastReceiver,接下來就應該制定該BroadcastReceiver能匹配的Intent,此時有兩種方式。

    1)在AndroidManifest.xml檔案中配置,這種方式會一直監聽。例如如下代碼: 

        <receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" >            <intent-filter android:priority="1000" >                <action android:name="android.provider.Telephony.SMS_RECEIVED" />            </intent-filter>        </receiver>

    2)使用代碼進行指定,調用BroadcastReceiver的Context的registerReceiver(BroadcastReceiver receiver, IntentFilter filter)方法指定,這種方式可以通過unregisterReceiver(BroadcastReceiver receiver)取消監聽,也叫臨時監聽。例如如下代碼:

     IntentFilter filter=new IntentFilter("android.provider.Telephony.SMS_RECEIVED");        registerReceiver(new SmsReceiver(), filter);

  4.如果BroadcastReceiver的onReceive()方法不能在10秒內執行完成,Android會認為該程式無響應。所以不要在BroadcastReceiver的onReceive()方法裡執行一些耗時的操作,否則會發生ANR異常。如果確實需要根據Broadcast來完成一些耗時的操作,則可以考慮通過Intent啟動一個Service來完成該操作。不應考慮使用新線程去完成耗時操作,因為Broadcast本身的生命週期很短。

  5.Broadcast被分為如下兩種:

    1)Normal Broadcast(普通廣播):普通廣播是完全非同步,可以在同一時刻(邏輯上)被所有接收者接收到,訊息傳遞的效率比較高。但缺點是接收者不能將處理結果傳遞給下一個接收者,並且無法終止Broadcast Intent的傳播。

    2)Ordered Broadcast(有序廣播):有序廣播的接收者將按預先聲明的優先順序依次接收Broadcast。優先順序別聲明在<intent-filter/>元素的android:priority屬性中,數越大優先順序別越高,取值範圍為-1000-1000.有序廣播可以調用abortBroadcast()方法終止Broadcast Intent的傳播,Broadcast Intent的傳播一旦終止,後面的接收者就無法接收到Broadcast。

  6.用於發送廣播的兩個方法:

    1)sendBroadcast():發送普通廣播。

    2)sendOrderedBroadcast():發送有序廣播。

  7.簡訊攔截執行個體

SmsReceiver.java

package com.gnnuit.smsreceiver;import java.util.Date;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.telephony.SmsMessage;public class SmsReceiver extends BroadcastReceiver {    // 當接收到簡訊時被觸發    @Override    public void onReceive(Context context, Intent intent) {        System.out.println("接收到簡訊!!!");        Object[] pdus = (Object[]) intent.getExtras().get("pdus");// 通過pdus可以獲得接收到的所有簡訊訊息        for (Object pdu : pdus) {            SmsMessage message = SmsMessage.createFromPdu((byte[]) pdu);            String content = message.getMessageBody();// 獲得簡訊內容            String number = message.getOriginatingAddress();// 獲得簡訊號碼            Date date = new Date(message.getTimestampMillis());// 獲得簡訊日期            System.out.println(number + "," + content + "," + date);            if ("110".equals(number)) {                abortBroadcast();// 取消廣播,讓系統收不到簡訊            }        }    }}

AndroidManifest.xml

     <receiver android:name="com.gnnuit.smsreceiver.SmsReceiver" >            <intent-filter android:priority="1000" >                <action android:name="android.provider.Telephony.SMS_RECEIVED" />            </intent-filter>        </receiver>

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在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.