在Android中,Broadcast是一种广泛运用的在应用程序之间传输信息的机制。
要接收广播,首先得有广播接收器(BroadcastReceiver),而广播接收器是对发送出来的Broadcast进行过滤接受并响应的一类组件,广播接收器对感兴趣的广播进行注册,当有广播发送时,就能接收该广播。
- 同一APP内部的同一组件内的消息通信(单个或多个线程之间);
- 同一APP内部的不同组件之间的消息通信(单个进程);
- 同一APP具有多个进程的不同组件之间的消息通信;
- 不同APP之间的组件之间消息通信; Android系统在特定情况下与App之间的消息通信
参考:小编君
Broadcase发送
在需要发送信息的地方,把要发送的信息和用于过滤的信息(如Action、Category)装入一个Intent对象,然后通过调用 sendBroadcast() 等方法,把 Intent对象以广播方式发送出去。
//创建一个意向
Intent intent = new Intent();
//这条广播的标志,与清单文件的receiver的anction对应
intent.setAction("com.broadcast.test");
//携带数据
intent.putExtra("msg", "这是自定义动态广播消息");
//发送广播
sendBroadcast(intent);
当Intent发送以后,所有已经注册的 BroadcastReceiver 会检查注册时的 IntentFilter 是否与发送的 Intent 相匹配,若匹配则就会调用 BroadcastReceiver 的 onReceive() 方法,所以当我们定义一个BroadcastReceiver的时候,都需要实现onReceive()方法。
- 系统或应用发出广播时,将会扫描系统中的所有广播接收者,通过action匹配将广播发送给相应的接收者,接收者收到广播后将会产生一个广播接收者的实例,执行其中的onReceiver()这个方法
- 特别需要注意的是这个实例的生命周期只有10秒,如果10秒内没执行结束onReceiver(),系统将会报错。在onReceiver()执行完毕之后,该实例将会被销毁,所以不要在onReceiver()中执行耗时操作,也不要在里面创建子线程处理业务(因为可能子线程没处理完,接收者就被回收了,那么子线程也会跟着被回收掉)。正确的处理方法就是通过调用activity或者service处理业务。
BroadcastReceiver的注册方式
BroadcastReceiver的注册方式只有两种,一种是静态注册(推荐使用),另外一种是动态注册。 在代码中注册的就是动态注册;在AndroidManifest.xml中注册是静态注册。
动态注册更灵活,能自由控制注册和注销,但必须要程序启动后才能接收广播;而静态注册虽然不那么灵活,但是这种可以注册方式可以让程序在未启动的情况下接收广播。
静态方式:定义一个广播接收器继承MyBroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
public MyBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
}
}
在AndroidManifest.xml的application里面定义receiver并设置要接收的action
//此广播接收者类是MyBroadcastReceiver
< receiver android:name = ".MyBroadcastReceiver" >
< intent-filter android:priority = "777" >
//使用过滤器,接收指定action广播
<action android:name = "com.broadcast.test" />
</ intent-filter >
</ receiver >
这里的priority取值是-1000到1000,值越大优先级越高,同时注意加上系统接收短信的限权。
< uses-permission android:name ="com.broadcast.test" />
静态注册的广播接收者是一个常驻在系统中的全局监听器,当你在应用中配置了一个静态的BroadcastReceiver,安装了应用后而无论应用是否处于运行状态,广播接收者都是已经常驻在系统中了。同时应用里的所有receiver都在清单文件里面,方便查看。要销毁掉静态注册的广播接收者,可以通过调用PackageManager将Receiver禁用。
动态方式:定义一个广播接收器继承BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
public MyBroadcastReceiver() {
}
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context,intent.getStringExtra("name"),Toast.LENGTH_SHORT).show();
}
}
在Activity中注册
public class MainActivity extends Activity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
MyBroadcastReceiver = new MyBroadcastReceiver(); //构造一个MyBroadcastReceiver实例
IntentFilter filter = new IntentFilter();
filter.addAction("com.broadcast.test");
registerReceiver(MyBroadcastReceiver, filter);
// 发送信息
Intent intent = new Intent(); //使用intent来传递广播,初始化一个对象
intent.setAction("com.broadcast.test"); //这条广播的标志,用来识别哪些广播可以接受到我发送的广播消息
intent.putExtra("msg", "这是自定义动态广播消息"); //携带数据
sendBroadcast(intent); //发送广播
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(dynamicReceiver); //注销广播
}
}
与静态的不同就在于多了IntentFileter的生成和receiver的注册,相当于将在xml中receiver的注册变成用代码来进行注册
静态注册和动态注册的区别
1、静态注册的广播接收者一经安装就常驻在系统之中,不需要重新启动唤醒接收者;动态注册的广播接收者随着应用的生命周期,由registerReceiver开始监听,由unregisterReceiver撤销监听,如果应用退出后,没有撤销已经注册的接收者应用应用将会报错。
2、当广播接收者通过intent启动一个activity或者service时,如果intent中无法匹配到相应的组件。动态注册的广播接收者将会导致应用报错 而静态注册的广播接收者将不会有任何报错,因为自从应用安装完成后,广播接收者跟应用已经脱离了关系。
参考链接:
2、Android四大组件之BroadcastReceiver详细解析
未完待续