什么是 BroadcastReceiver?
BroadcastReceiver 作为 Android 四大基础组件之一,可以方便地实现不同基础组件、不同应用程序进程之间的通信,它可以监听全局的广播信息,这些广播信息可以由开发者自行开发的程序发出,也可以由 Android 系统程序发出,BroadcastReceiver 可以监听并接收这些广播信息。
BroadcastReceiver的意义?
再举个场景使用的案例:当在 Activity 中启动 Service 后,Activity 和 Service 在运行过程往往需要进行数据传递,例如由 Activity 控制 Service 中的音乐播放器是否播放、Service 定时向 Activity 传递数据的下载情况以便 Activity 更新 UI界面等,此时,通过 BroadcastReceiver 可以比较方便地实现不同基础组件之间的数据传递工作。
【发送广播信息】
发送广播信息的两种方式
- 第一种为:发送普通广播
- 意思:所有接受者都可以同时接收到这个广播信息,但不能修改广播信息。
Intent intent = new Intent();
intent.setAction("ccv.turbosnail.broadcastdemo"); //接收方匹配 Action 才能接收广播
intent.putExtra("data","普通广播信息");
sendBroadcast(intent); // 发送 普通 广播
- 第二种为:发送有序广播
- 意思:优先级高的广播接受者最先接收,低优先级的后接收,优先级高的广播接受者可以控制广播停止传播,也可以修改广播传递消息的内容
Intent intent = new Intent();
intent.setAction("ccv.turbosnail.broadcastdemo"); //接收方匹配 Action 才能接收广播
intent.putExtra("data","普通广播信息");
sendOrderedBroadcast(intent,null); // 发送 有序 广播
【接收广播信息】
1.
广播接收器 BroadcastReceiver 对象用来监听和接收广播信息,接收到相应广播后,会自动回调 onReceive() 方法,因此,接收广播信息后的处理、与其它组件的交互操作一般都可以放在 onReceive() 方法中。
@Override
public class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String data = intent.getStringExtra("data");
Toast.makeText(ReceiverActivity.this,data,Toast.LENGTH_LONG).show();
}
}
修改获取到的值的方法:
Bundle bundle = new Bundle();
bundle.putString("data",data + "追加的数据");
setResultExtras(bundle);
注册广播接收器(两种方式):
方式一:
可以在AndroidManifest.xml 里通过<receive> 标签注册自定义的广播接收器
<receiver android:name=".ReceiverActivity$MyReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
对于有序的广播来说,需要在标签中添加优先级属性说明,优先级的取值范围在[-1000,1000],数值越大,优先级越高。具体写法如下:
<intent-filter android:priority="900"></intent-filter>
方式二:
MyReceiver myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("ccv.turbosnail.broadcastdemo");
registerReceiver(myReceiver,intentFilter);
通过java代码来注册,但是要注意!在使用完成后记得取消注册!代码如下:
unregisterReceiver(myReceiver);
一般情况下,建议在 onResume() 方法中注册广播接收器,在 onPause() 方法中取消注册