首页 > 代码库 > Broadcast Receiver基本使用
Broadcast Receiver基本使用
Broadcast Receiver介绍
Broadcast Receiver翻译成中文叫“广播接收器”,所以它的作用是用来接收发送过来的广播的。
Android应用程序可以发送或接收来自Android系统和其他Android应用程序的广播消息,类似于发布订阅设计模式。当有兴趣的事件发生时发送这些广播。例如,Android系统在各种系统事件发生时发送广播,例如当系统启动或设备开始充电时。应用程序也可以发送自定义广播,例如,通知其他应用程序的东西,他们可能感兴趣(例如,一些新的数据已被下载)。应用程序可以注册接收特定的广播。当发送广播时,系统自动将广播路由到订阅该特定类型广播的应用程序。
一般来说,广播可以作为跨应用程序和正常用户流之外的消息传递系统。
动态注册广播
动态注册广播是一种灵活的注册方式,通过代码来注册广播,销毁广播。
首先我们新建DynamicBroadcast类,继承自BroadcastReceiver,用来接收广播,重写onReceive方法,通过intent可以获取发送广播时传入的参数。
public class DynamicBroadcast extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent){
String data = http://www.mamicode.com/intent.getStringExtra("data");
Log.i("data",data);
}
}
在activity_main.xml文件中增加一个按钮
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_dynamic_broadcast_send_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="给动态注册的广播发送消息"/>
</LinearLayout>
最后我们下来看MainActivity.java
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
public static final String ACTION_DYNAMIC_BROADCAST="android.intent.action.DYNAMIC_BROADCAST";
private DynamicBroadcast dynamicBroadcast;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
findViewById(R.id.btn_dynamic_broadcast_send_message).setOnClickListener(this);
//动态注册广播
dynamicBroadcast=new DynamicBroadcast();
IntentFilter intentFilter=new IntentFilter(ACTION_DYNAMIC_BROADCAST);
registerReceiver(dynamicBroadcast,intentFilter);
}
@Override
public void onClick(View v){
switch (v.getId()){
case R.id.btn_dynamic_broadcast_send_message:
Intent intent = new Intent(ACTION_DYNAMIC_BROADCAST);
intent.putExtra("data","Dynamic Broadcast Parameter");//通过intent传参
sendBroadcast(intent);//发送广播消息
break;
}
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.i("MainActivity onDestroy","销毁广播");
unregisterReceiver(dynamicBroadcast);
}
}
我们在onCreate中通过registerReceiver方法注册一个广播,需要两个参数(BroadcastReceiver跟IntentFilter对象)。同时给”发送广播”按钮设置点击监听,点击之后通过sendBroadcast方法发送广播,这里需要一个Intent对象,构造Intent对象的时候传入Action,这个Action跟我们注册广播的时候Action要一致。
我们还重写了onDestroy方法,当Activity销毁的时候同时销毁广播,所以,在本例中,广播的生命周期跟Activity一样。
我们运行代码,点击”给动态注册的广播发送消息”按钮,Log打印如下:
02-03 16:32:11.194 7095-7095/com.ansen.broadcastreceiver I/data: Dynamic Broadcast Parameter
静态注册广播
静态注册广播是在AndroidManifest.xml文件中注册的,无论这个程序是否启动,当收到广播时,都会接收的到。
我们在动态注册广播的Demo上增加代码,新建StaticBroadcast类,继承BroadcastReceiver,实现onReceive方法,跟动态广播的接收器代码几乎一样。
public class StaticBroadcast extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent){
String data = http://www.mamicode.com/intent.getStringExtra("data");
Log.i("data",data);
}
}
接下来我们需要在AndroidManifest.xml文件中注册这个广播,通过receiver标签的name属性指定这个类,再增加intent-filter标签,给action标签设置name属性值,我们发送广播的时候需要用到这个值。
<receiver android:name=".StaticBroadcast" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.STATIC_BROADCAST"/>
</intent-filter>
</receiver>
在activity_main.xml文件中增加一个按钮,”给静态注册的广播发送消息”。
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:orientation="vertical">
<Button
android:id="@+id/btn_dynamic_broadcast_send_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="给动态注册的广播发送消息"/>
<Button
android:id="@+id/btn_static_broadcast_send_message"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="给静态注册的广播发送消息"/>
</LinearLayout>
给按钮设置点击监听事件,在对应的onClick回掉方法中发送广播,我们看到Intent的构造方法有传入一个字符串,这个值跟我们在xml中receiver标签->intent-filter->action的name属性的值必须要一致。在广播底层源码中就是通过action来区分不同的广播接收者。
Intent staticIntent = new Intent("android.intent.action.STATIC_BROADCAST");
staticIntent.putExtra("data","Static Broadcast Parameter");//通过intent传参
sendBroadcast(staticIntent);//发送广播消息
因为没有增加很多代码,MainActivity的代码就不全部贴出来了,重新运行代码,点击“给静态注册的广播发送消息”按钮,打印的log如下:
02-06 14:02:38.735 10749-10749/com.ansen.broadcastreceiver I/data: Static Broadcast Parameter
广播基本总结
动态注册广播跟静态注册广播区别
前面我们写了Demo,也介绍了动态注册广播跟静态注册广播,这里我再来总结一下:
- 动态注册 广播的生命周期自己灵活控制,消耗资源少。
- 静态注册 广播一直存在,除非软件卸载。消耗资源稍微大一些。当然现在的手机硬件都跟的上了,这点资源可以忽略不计。
广播注意事项
我们都知道收到了广播就会执行onReceive方法,但是在这个方法里面不能做耗时超过10秒的事情,否则会弹出ANR(Application NoResponse)的对话框。如果有需要就另外启动一个Thread处理耗时操作。
LocalBroadcastManager解决BroadcastReceiver安全问题
LocalBroadcastManager是Android Support包提供了一个工具,是用来在同一个应用内的不同组件间发送Broadcast的
。可以解决BroadcastReceiver的安全问题(恶意程序脚本不断的去发送你所接收的广播)。
使用LocalBroadcastManager有以下好处:
- 发送的广播只会在自己App内传播,不会泄露给其他App,确保隐私数据不会泄露
- 其他App也无法向你的App发送该广播,不用担心其他App会来搞破坏
- 比系统全局广播更加高效
使用方法跟动态注册广播类似。首先需要获取LocalBroadcastManager对象,单例模式获取,然后调用registerReceiver方法。
broadcastManager = LocalBroadcastManager.getInstance(this);
localReceiver=new LocalBroadcastReceiver();
broadcastManager.registerReceiver(localReceiver,new IntentFilter(ACTION_LOCAL_BROADCAST));
发送广播也类似。这里一定需要调用LocalBroadcastManager对象的sendBroadcast方法发送广播哦,不然接收不到广播
Intent localIntent=new Intent(ACTION_LOCAL_BROADCAST);
localIntent.putExtra("data","Local Broadcast Parameter");//通过intent传参
LocalBroadcastManager.getInstance(this).sendBroadcast(localIntent);
顺便在onDestroy方法中取消注册。
@Override
protected void onDestroy(){
super.onDestroy();
Log.i("MainActivity onDestroy","销毁广播");
unregisterReceiver(dynamicBroadcast);
broadcastManager.unregisterReceiver(localReceiver);
}
因为跟动态注册广播类似,所以只贴出了关键代码。
源码下载
Broadcast Receiver基本使用