編輯:Android開發實例
前言
上一篇,講了BroadcastReceiver的一些基礎內容,如何注冊以及發送一個廣播,那是基礎,不清楚的可以先看看:http://www.fengfly.com/plus/view-214088-1.html。但是在實際開發當中,大部分情況下是不需要自己發布一個Broadcast或者接收自己定義的Broadcast的,一般而言,都是攔截系統在做某個操作而發布的Broadcast,對其進行相應的處理。本文就以兩個示例來講講Android系統中,如何攔截系統Broadcast並對其進行處理。
系統中的廣播
在Android系統中,內置了很多Action產量,在觸發這些Action的時候,均會發布相應的Broadcast。一般而言,查看Android的API文檔中,關於Intent的說明即可找到對應Action的Broadcast,但是列舉的還不是很全,最好還是下載Android的源代碼,通過查看源代碼的方式查看需要攔截的Broadcast。
下面列舉一些常用的廣播:
下面通過兩個例子,來講解如何在Android下,攔截系統Broadcast並對其進行處理。
通過關鍵字攔截短信
從上面列舉的一些動作會發布的Broadcast,可以找到,當系統接收到一條短信的時候,會發布一個“android.provider.Telephony.SMS_RECEIVED”的Broadcast,之前已經介紹過了,一般系統Broadcast都是有序廣播,如果不被高優先級的BroadcastReceiver停止傳遞,會按照優先級順序傳遞下去。
而在這個示例中,通過監聽接收短信的廣播,當其內容有黑名單中的關鍵字的話,則阻止Broadcast繼續傳播,並使用Toast提示,否則正常提示短信信息。
通過上一篇了解到,onReceive方法的Intent參數包含了這條廣播傳遞的參數,對於短信信息而言,需要獲取key為"pdus"的數組,取出數組中每一項,它的每一項代表了一個byte[]格式的短信,需要使用SmsMessage類解析短信內容。
當然,攔截短信的Broadcast侵犯了隱私,需要注冊接收短信的權限:
- <uses-permission android:name="android.permission.RECEIVE_SMS"/>
下面直接展示源代碼了,關鍵注釋已經寫的很清楚了,這裡不再累述:
MessageBroadcast.java:
- package cn.bgxt.Broadcastdemo.MessageWarn;
- import java.text.SimpleDateFormat;
- import java.util.Date;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- import android.os.Bundle;
- import android.telephony.SmsMessage;
- import android.widget.Toast;
- public class MessageBroadcast extends BroadcastReceiver {
- // 在模擬器上,通過DDMS發送短信會產生亂碼,所以使用拼音代替
- //在真機上不存在亂碼的問題
- private final String[] blackKeyWord = new String[] { "baoxian", "chuxiao",
- "jiangjia" };
- @Override
- public void onReceive(Context context, Intent intent) {
- // 判斷當前接收到的Broadcast是否是收到短信的action
- if (intent.getAction()
- .equals("android.provider.Telephony.SMS_RECEIVED")) {
- StringBuilder sb = new StringBuilder();
- // 獲取Broadcast傳遞的數據
- Bundle bundle = intent.getExtras();
- if (bundle != null) {
- Object[] pdus = (Object[]) bundle.get("pdus");
- for (Object p : pdus) {
- byte[] pud = (byte[]) p;
- // 聲明一個SmsMessage,用於解析短信的byte[]數組
- SmsMessage message = SmsMessage.createFromPdu(pud);
- boolean flag = false;
- for (String str : blackKeyWord) {
- if (message.getMessageBody().contains(str) ) {
- // 發現黑名單關鍵字,則標記為true
- flag = true;
- break;
- }
- }
- if (flag) {
- sb.append("發件人:\n");
- sb.append(message.getOriginatingAddress());
- sb.append("\n發送時間:\n");
- Date date = new Date(message.getTimestampMillis());
- SimpleDateFormat format = new SimpleDateFormat(
- "yyyy-MM-dd HH:mm:ss");
- sb.append(format.format(date));
- sb.append("\n短信內容:\n");
- sb.append(message.getMessageBody());
- Toast.makeText(context, sb.toString(),
- Toast.LENGTH_SHORT).show();
- // 如果存在黑名單關鍵字內容,停止Broadcast傳播
- abortBroadcast();
- }
- }
- }
- }
- }
- }
在AndroidManifest.xml中配置Receiver。
- <receiver android:name="cn.bgxt.Broadcastdemo.MessageWarn.MessageBroadcast">
- <!-- 設置優先級,短信優先級為0,大於0即可 -->
- <intent-filter android:priority="200">
- <action android:name="android.provider.Telephony.SMS_RECEIVED"/>
- </intent-filter>
- </receiver>
效果展示,先發送一個包含黑名單中關鍵字的短信,再發送一個正常的短信。
IP撥號
再來看看IP撥號的示例,在Android中,如果觸發撥打電話的Action,則會發布一個"android.intent.action.NEW_OUTGOING_CALL"的Broadcast出來,只需要針對它進行攔截即可,然後在加上IP前綴,把處理過的號碼添加到數據傳遞給下一個Receiver。
處理接收撥打電話的Broadcast,需要對Android增加權限:
- <uses-permission android:name="android.permission.PROCESS_OUTGOING_CALLS"/>
下面直接上代碼了,注釋寫的很清楚,這裡不再累述了。
IpCallPhone.java:
- package cn.bgxt.Broadcastdemo.IpCall;
- import android.content.BroadcastReceiver;
- import android.content.Context;
- import android.content.Intent;
- public class IpCallPhone extends BroadcastReceiver {
- private final String STARTS="17951";
- @Override
- public void onReceive(Context context, Intent intent) {
- // 獲取當前撥號的號碼
- String number=getResultData();
- // 此號碼沒有被加IP撥號的前綴
- if(!number.startsWith(STARTS)){
- // 設置加了IP號碼的號碼
- String newnumber=STARTS+number;
- // 把新號碼增加到返回結果數據中,用於傳遞給後面的Receiver
- setResultData(newnumber);
- }
- }
- }
AndroidManifest.xml配置Receiver:
- <receiver android:name="cn.bgxt.Broadcastdemo.IpCall.IpCallPhone">
- <intent-filter android:priority="200">
- <action android:name="android.intent.action.NEW_OUTGOING_CALL"/>
- </intent-filter>
- </receiver>
效果展示:
源碼下載
總結
Android系統中內置了非常多的Broadcast,用於對系統事件的響應、攔截、操作,這裡只是介紹了兩個比較典型的例子。在實際開發中,可以根據需要,查找Android源代碼中相應的應用中的代碼找到需要的Broadcast,以及如何處理的例子,這裡就不一一介紹了。
登錄應用程序的屏幕,詢問憑據登錄到一些特定的應用。可能需要登錄到Facebook,微博等本章介紹了,如何創建一個登錄界面,以及如何管理安全問題和錯誤嘗試。首先,必須定義兩
Android提供了許多方法來控制播放的音頻/視頻文件和流。其中該方法是通過一類稱為MediaPlayer。Android是提供MediaPlayer類訪問內置的媒體播放
可以顯示在的Android任務,通過加載進度條的進展。進度條有兩種形狀。加載欄和加載微調(spinner)。在本章中,我們將討論微調(spinner)。Spinner 用
本文實例講述了Android編程使WebView支持HTML5 Video全屏播放的解決方法。分享給大家供大家參考,具體如下: 1)需要在AndroidManif