Android系统四大组件,Activity(活动)提供界面负责用户交互,Service(服务)没有用户界面主要是在后台执行任务,Content Provider(内容提供者)用于不同应用间数据共享,今天介绍的是最后一个,BroadcastReceiver(广播接收器)。
一、 BroadcastReceiver是什么
二、 BroadcastReceiver基本用法
三、 BroadcastReceiver例子
四、 BroadcastReceiver总结
一、 BroadcastReceiver是什么
简单来说,BroadcastReceiver广播接收器就是一个全局的监听器,它可以监听用户自己开发的程序和系统的发出的广播消息。具体来说,我们的手机在使用过程中肯定会经历很多的状态,比如电池电量低、系统的时间变化、系统收到短信等等,这些状态发生时系统会对外发送标准广播,我们通过继承BroadcastReceiver新建自己的广播接收器来监听这些标准广播,即可在特定的时候完成指定的操作。
二、 BroadcastReceiver基本用法
这里先假设我们是自己要发送条广播,那么我们首先要做的是创建Intent对象,在Intent里使用setAction方法来设置通知的标识,用以区分广播,同时可以在Intent里携带数据,最后调用方法sendBroadcast来发送广播。
1.发送广播
下面的代码展示了发送广播,代码的逻辑就是点击按钮时发送一条广播。
public class BroadcastActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity_bc);
//点击按钮时
Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
btnSendBC.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//实例化Intent
Intent mIntent = new Intent();
//设置标识
mIntent.setAction("com.jackaltsc.android.actiontest");
//携带数据
mIntent.putExtra("msg", "自定义的广播消息");
//开始发送
sendBroadcast(mIntent);
}
});
}
}
2.接收广播
为了接收到广播,必须新建继承BroadcastReceiver的子类,在里面实现onReceive方法来处理逻辑。
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.e("---bbb---", "接收到广播内容为:" + intent.getStringExtra("msg"));
}
}
3.注册广播
我们有广播发送,有广播接收,那么怎么把两者关联起来呢?这时,就需要在清单文件里对接收器进行注册。
<!--接收器-->
<receiver android:name=".receiver.MyReceiver">
<intent-filter>
<action android:name="com.jackaltsc.android.actiontest"/>
</intent-filter>
</receiver>
可以看到,我们把接收器和发送广播时的标识关联了起来,这样广播接收器就可以接收到通知了。
输出结果如下:
输出结果补充一点,我们在第三步是在清单文件里注册广播的,这里还有另外一种方法是在代码里设置。我们修改之前的Activity里的代码,同时删除掉清单文件里的Receiver注册的部分代码,同样可以看到结果。
public class BroadcastActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.layout_activity_bc);
//点击按钮时
Button btnSendBC = (Button) findViewById(R.id.btn_send_bc);
btnSendBC.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//过滤器
IntentFilter filter = new IntentFilter("com.jackaltsc.android.actiontest");
//实例化
MyReceiver myReceiver = new MyReceiver();
//注册接收器
registerReceiver(myReceiver, filter);
//实例化Intent
Intent mIntent = new Intent();
//设置标识
mIntent.setAction("com.jackaltsc.android.actiontest");
//携带数据
mIntent.putExtra("msg", "自定义的广播消息");
//开始发送
sendBroadcast(mIntent);
}
});
}
}
三、 BroadcastReceiver例子
前面我们提到,系统在很多特定的时候会发送一些广播,我们选择特定的广播进行处理,可以实现我们的需要。
下面展示下怎么获取手机短信内容。
1.新建广播接收器
public class MessageReceiver extends BroadcastReceiver {
private final String action = "android.provider.Telephony.SMS_RECEIVED";
@Override
public void onReceive(Context context, Intent intent) {
if (intent.getAction().equals(action)) {
abortBroadcast();
//用来存放结果的字符串
StringBuilder sb = new StringBuilder();
//取出信息内容的载体
Bundle bundle = intent.getExtras();
//如果内容不为空
if (bundle != null) {
//得到信息内容 是一段一段的
Object[] pdus = (Object[]) bundle.get("pdus");
//短信对象数组
SmsMessage[] messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++) {
messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
}
//循环遍历短信数组 取出内容
for (int i = 0; i < messages.length; i++) {
if (i == 0) {
sb.append("发件人:" + messages[i].getDisplayOriginatingAddress()
+ "\n信息内容为:\n");
}
sb.append(messages[i].getDisplayMessageBody() + "\n");
}
Log.e("---sss---", sb.toString());
}
}
}
}
2.清单文件里注册
<receiver android:name=".receiver.MessageReceiver">
<intent-filter android:priority="1000">
<action android:name="android.provider.Telephony.SMS_RECEIVED"/>
</intent-filter>
</receiver>
3.添加接收短信的权限
<uses-permission android:name="android.permission.RECEIVE_SMS"/>
最后可以看到输出结果如下:
读取短信内容四、BroadcastReceiver总结
下面是对BroadcastReceiver的小结。
1.广播的两种注册方式
广播Broadcast的注册方式有两种,一种是在清单文件里静态注册,还有一种是在代码里动态注册,那么两种的区别是什么呢。 通过在配置文件里面注册广播属于常驻型广播,即便应用程序结束,一旦有了对应的广播过来,其还是会被激活;而在代码里注册的广播则是非常驻型广播,比如在oncreate方法里面注册一个广播,那么在ondestroy里就可以BroadcastReceiver.abortBroadcast()。对于第一种方法,我们需要养成一个良好的习惯:在Activity进入停止或者销毁状态的时候使用unregisterReceiver方法将注册的BroadcastReceiver注销掉。如果在清单文件里静态注册,那么该对象的实例在onReceive被调用之后就会在任意时间内被销毁。也就是说,我们并需要担心静态注册的BroadcastReceiver的销毁问题。
2.广播的两种类型
广播Broadcast有两种类型,我们通过方法sendBroadcast()发送的是无序广播,它是完全异步的,可以同时被所有接收者接收到,消息传递效率高,但是接收者不能把处理结果传递给下一个接收者,且不能终止广播的继续传播。通过sendOrderedBroadcast()发送的是有序广播,系统会根据接收器声明的优先级别按顺序逐个接收,先接收广播的可以使用abortBroadcast()方法终止Broadcast的继续传播,此外,先接收到广播的还可以通过方法setResultExtras来存数据到广播中,下一个接收到的可以获取存入的数据。
3.其它注意点
在新建自己的广播接收器时,我们要实现onReceive()方法,在里面完成自己的逻辑,这里不能做耗时的操作,建议是10s以内。
网友评论