BroadcastReceiver简介
广播告知自己就可以了,大大减少了开发的工作量和开发周期。
BroadcastReceiver也就是“广播接收者”的意思,顾名思义,它就是用来接收来自系统和应用中的广播。
在Android系统中,广播体现在方方面面,例如当开机完成后系统会产生一条广播,接收到这条广播就能实现开机启动服务的功能;当网络状态改变时系统会产生一条广播,接收到这条广播就能及时地做出提示和保存数据等操作;当电池电量改变时,系统会产生一条广播,接收到这条广播就能在电量低时告知用户及时保存进度,等等。
Android中的广播机制设计的非常出色,很多事情原本需要开发者亲自操作的,现在只需等待广播告知自己就可以了,大大减少了开发的工作量和开发周期。而作为应用开发者,就需要数练掌握Android系统提供的一个开发利器,那就是BroadcastReceiver。
下面我们就对BroadcastReceiver逐一地分析和演练,了解和掌握它的各种功能和用法。
首先,我们来演示一下创建一个BroadcastReceiver,并让这个BroadcastReceiver能够根据我们的需要来运行。
1、定义接收器
要创建自己的BroadcastReceiver对象,我们需要继承android.content.BroadcastReceiver,并实现其onReceive方法。下面我们就创建一个名为MyReceiver广播接收者:
public class MyReceiver extends BroadcastReceiver {
/**
* 当接收到消息时触发
*
* @param context
* @param intent
*/
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, "接收到信息:" + action, Toast.LENGTH_LONG).show();
if (Intent.ACTION_BOOT_COMPLETED.equals(action)) {
Log.e("m_tag", "====== boot complete");
}
}
}
// 静态注册:需要在 manifest.xml 中使用 <receiver> 标签注册该接收器(常驻后台)
<receiver android:name="com.xykj.intentandbradcast.MyReceiver">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"/>
<action android:name="abc123"/>
</intent-filter>
</receiver>
// 动态注册:在 java 中通过 regist.. 以及 unRegist.. 进行注册和取消注册
class TestReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
Toast.makeText(context, " 接收到消息: " + action, Toast.LENGTH_LONG).show();
}
}
动态注册
private TestReceiver receiver;
...
receiver = new TestReceiver();
//IntentFilter 过滤器来添加接收器所需要监听的 Action
IntentFilter filter = new IntentFilter();
filter.addAction("hello");
filter.addAction(Intent.ACTION_SCREEN_ON);
// 注册广播
context.registerReceiver(receiver,filter);
取消注册
context.unregisterReceiver(receiver);
应用内部广播 ( 本地广播 )
在 support v4 包中提供了 LocalBroadcastManager 来完成应用内广播的管理,可以实现广播消息只在应用内部传递,不会传到其他应用去
注册
localReceiver = new LocalReceiver();
IntentFilter filter1 = new IntentFilter();
filter1.addAction("hello");
filter1.addAction("abc123");
LocalBroadcastManager.getInstance(this).registerReceiver(localReceiver,filter1);
取消注册
LocalBroadcastManager.getInstance(this).unregisterReceiver(localReceiver);
发送广播
LocalBroadcastManager.getInstance(this).sendBroadcast(new Intent("abc123"));