Broadcast Receiver(一)

来源:互联网 发布:淘宝注册开店要多少钱 编辑:程序博客网 时间:2024/05/18 14:23

Broadcast是android的四大组件中唯一需要被动接受数据的组件。也就是说,对于activity,contentProvider和service,都可以主动调用,并获得返回数据,而负责接收broadcast数据的接收器却永远不知道什么时候可以接受到广播。broadcast类似于面向对象中的事件(event),对于事件来说,就不知道什么时候用户会去触发,只能静待着不可预知事件的发生。因此,广播也被称为全局事件,或者系统事件。

广播的最大用途就是接受系统发出的消息。eg:当收到短信时,可以截获短信的电话号码和短信内容,当来电时可以截获来电的各种状态(响铃,接听,挂断);

For example:短信拦截

编写一个拦截短信广播的接收器类,该类必须从android.content.BroadcastReceiver继承:

import java.util.Set;import android.content.BroadcastReceiver;import android.content.Context;import android.content.Intent;import android.os.Bundle;import android.telephony.SmsMessage;import android.util.Log;import android.widget.Toast;public class ShortMessageReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) {  Bundle bundle = intent.getExtras();  if(bundle != null){   Set<String> keys = bundle.keySet();   for(String key : keys){    Log.d("key", key);   }   Object[] objects = (Object[]) bundle.get("pdus");   SmsMessage[] messages = new SmsMessage[objects.length];   for(int i =0; i<objects.length; i++){    messages[i] = SmsMessage.createFromPdu((byte[]) objects[i]);    String s = "手机号:"+messages[i].getOriginatingAddress()+"\n";    s += "短信内容:"+messages[i].getDisplayMessageBody();    Toast.makeText(context, s, Toast.LENGTH_LONG).show();   }  } }}

广播接收器需要在AndroidManifest.xml中进行注册,并且由于android的安全机制,必须在AndroidManifest.xml文件中打开接收短信的权限。

<?xml version="1.0" encoding="utf-8"?><manifest xmlns:android="http://schemas.android.com/apk/res/android"    package="cn.yh.smsbroadcastreceiver"    android:versionCode="1"    android:versionName="1.0" >    <uses-sdk        android:minSdkVersion="8"        android:targetSdkVersion="17" /><uses-permission android:name="android.permission.SEND_SMS"/>    <application        android:allowBackup="true"        android:icon="@drawable/ic_launcher"        android:label="@string/app_name"        android:theme="@style/AppTheme" >        <activity            android:name="cn.yh.smsbroadcastreceiver.MainActivity"            android:label="@string/app_name" >            <intent-filter>                <action android:name="android.intent.action.MAIN" />                <category android:name="android.intent.category.LAUNCHER" />            </intent-filter>        </activity>        <receiver android:name="cn.yh.smsbroadcastreceiver.ShortMessageReceiver"            android:enabled="true">            <intent-filter>                <action android:name="android.provider.Telephony.SMS_RECEIVED"/>            </intent-filter>        </receiver>    </application></manifest>

android.provider.Telephony.SMS_RECEIVED Eclipse不进行提示,手写即可。
运行,在Emulator Control中模拟短信发送:

在发送短信之后程序就会接收到广播.