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中模拟短信发送:
在发送短信之后程序就会接收到广播.