一,Broadcast Receiver详情
通过发广播的形式,将消息传播过去,实现消息的传播。
按照广播机制也可以分为两种,标准广播和有序广播
无序广播:所有的接收者都会接收事件,不可以被拦截,不可以被修改。
有序广播:按照优先级,一级一级的向下传递,接收者可以修改广播数据,也可以终止广播事件。
Android中广播的使用:
动态注册(纯Java):
1,注册广播
2,接收广播
代码:
public class BroadcastActivity extends AppCompatActivity {
MyReceiver myReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_broadcast);
//动态注册广播
myReceiver = new MyReceiver();
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("com.xxx.broadcast");
registerReceiver(myReceiver , intentFilter);
}
/**
* 发送广播
* @param view
*/
public void onsend(View view){
Intent intent = new Intent();
//指定发送频道
intent.setAction("com.xxx.broadcast");
//发送内容
intent.putExtra("msg" , "发送广播");
sendBroadcast(intent);
}
/**
* 接收信息
*/
private class MyReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context , msg , Toast.LENGTH_LONG).show();
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(myReceiver);
}
}
显示:
注意:要添加注销,否则会出现报错
unregisterReceiver(myReceiver);
静态注册:
- 在AndroidMainFest中的application标签下加上receiver的子标签
- 与通过name属性指定注册一个广播类,也就是我们刚才定义的那个广播类,还有enabled与exported属性,enabled代表是否启用这个广播接收器,exported属性表示是否允许这个广播接收器接受本程序以外的广播(这两步可以通过Android Studio自动完成)
- 之后在receiver标签下加上intent-filter标签,设置其的action
代码如下:
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="com.xxx.action.broadcast"/>
</intent-filter>
</receiver>
发送广播:
/**
* 发送广播
* @param view
*/
public void onsend(View view){
Intent intent = new Intent();
//指定发送频道
intent.setAction("com.xxx.action.broadcast");
//android8.0以后静态发送广播要添加这个
intent.setComponent(new ComponentName("qzjiami.a" ,"qzjiami.a.MyReceiver"));
//发送内容
intent.putExtra("msg" , "发送广播");
sendBroadcast(intent);
}
接收广播(新建类)
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String msg = intent.getStringExtra("msg");
Toast.makeText(context , msg , Toast.LENGTH_LONG).show();
}
}
注意:Android8.0以后隐式注册广播是不能用的。要使用如下添加:
//android8.0以后静态发送广播要添加这个
intent.setComponent(new ComponentName("qzjiami.a" ,"qzjiami.a.MyReceiver"));
显示如下: