Broadcast(一)
同一个广播可由不同的BroadcastReceiver来接受,实现不同的功能如接收短消息。
继承BroadcastReceiver,就需要重写BroadcastReceiver里面的onReceiver方法。同时需要早Manifest.xml中注册。
1简单小例子
a. TestBCActivity extends Activity{}中
Intent intent=new Intent();
intent.setAction(intent.ACTION_EDIT); TestBCActivity.this.sendBroadcast(intent);
b.接收器
public class TestReceiver extends BroadcastReceiver {
@Override public void onReceive(Context context, Intent intent) { System.out.println("ddddddddd");
}
}
c.Manifest.xml中
<!--广播注册-->
<receiver android:name=".TestReceiver">
<intent-filter >
<action android:name="android.intent.action.EDIT"/>
</intent-filter>
</receiver>
当activity发送广播时,配置文件会从多个RECEIVER 中寻找匹配的action来执行相应的操作。
Broadcast(二)
BroadcastReceiver注册方法有两种,
1.在程序代码中注册
2.在Manifest.xml中注册,如上例。特点是即使应用程序被关闭后,仍可接收广播。如监听电池电量。
这次着重在代码中注册,
a.注册BroadcastReceiver
registerReceiver(smsReceiver, filter);
b.取消注册
unregisterReceiver(smsReceiver);
一个接收短消息的例子
a.在activity中定义一个常量
private static final String SMS_ACTION="android.provider.Telephony.SMS_RECEIVED";
b. 注册监听
//生成一个BroiadcastReceiver对象
smsReceiver = new SMSReceiver();
//生成一个IntentFilter对象 //和Manifest中intent-filter标签的作用一样
//它是一个过滤器 它规定本receiver能够对哪些action发出的广播进行相应
IntentFilter filter = new IntentFilter();
//为IntentFilter添加一个Action
filter.addAction(SMS_ACTION);
//将BroadcastReceiver对象注册到系统当中
TestBCActivity.this.registerReceiver(smsReceiver, filter);
c 取消注册
//解除BroadcastReceiver对象的注册
TestBCActivity.this.unregisterReceiver(smsReceiver);
d receiver接收消息并解析
public class SMSReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
System.out.println("receive message");
//接受Intent对象当中的数据
//Bundle类用作携带数据,它类似于Map,用于存放key-value名值对形式的值
//Bundle的内部实际上是使用了HashMap<String, Object>类型
//它提供了各种常用类型的putXxx()/getXxx()方法,如:putString()/getString()和putInt()/getInt()
Bundle bundle = intent.getExtras();
//在Bundle对象当中有一个属性名为pdus,这个属性的值是一个Object数组
Object[] myOBJpdus = (Object[]) bundle.get("pdus");
//创建一个SmsMessage类型的数组
SmsMessage[] messages = new SmsMessage[myOBJpdus.length];
System.out.println(messages.length);
for (int i = 0; i<myOBJpdus.length; i++)
{
//使用Object数组当中的对象创建SmsMessage对象
messages[i] = SmsMessage.createFromPdu((byte[]) myOBJpdus[i]);
//调用SmsMessage对象的getDisppalyMessageBody()方法,就可以得到消息的内容
System.out.println(messages[i].getDisplayMessageBody());
}
}
}
e.同时不要忘了在配置文件中添加权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
当我们在ddms中发送消息的时候,
logcat里面就会打印出解析的信息