一、 广播的含义
1.广播是Android的四大组件之一,全称是BroadcastReceiver
2.广播分为发送方和接受方(就算没有接收方,发送方也会发送数据)
3.广播可以实现跨多个页面的数据通信
4.广播可以跨进程甚至多个APP间的数据通信
二、广播的分类
分类 | 详解 |
---|---|
无序广播 | 无论多少接受者,一发此广播,所有监听此广播的接受者都可收到 |
有序广播 | 按照接受者的优先级,逐一传递。优先级最高的接收方有是否继续传递的决定权 |
粘滞广播 | 发出后,如果没有接受方,则会一直等待,直到广播接收 |
三、静态注册无序广播示例
1.新建类继承BroadcastReceiver,然后在里面实现他的onReceive抽象方法
public class MyBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "我是你爸爸", Toast.LENGTH_SHORT).show();
}
}
2.在AndroidManifest中注册BroadcastReceiver
<receiver android:name=".MyBroadcastReceiver">
<intent-filter >
<action android:name="broadcast" />
</intent-filter>
</receiver>
3.在有Context环境中通过sendBroadcast发送广播
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_zhifubao);
Intent intent=new Intent();
intent.setAction("broadcast");//选择频道号
sendBroadcast(intent);//发送广播
四、动态注册发送无序广播示例
1.新建类继承BroadcastReceiver,然后在里面实现他的onReceive抽象方法
public class MyBroadcastReceiver extends BroadcastReceiver {
private String ATG="";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ATG,"我是你爸爸");
Toast.makeText(context, "我是你爸爸", Toast.LENGTH_SHORT).show();
}
}
2.在代码中实例化MyBroadcastReceiver广播类,并且实例化IntentFilter
private MyBroadcastReceiver receiver;
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
3.调用IntentFilter对象的addAction方法设置频道号
filter.addAction("broadcast");
4.在有Context环境中通过sendBroadcast发送广播
//动态注册广播接收器
registerReceiver(receiver, filter);
在有Context环境中通过unregisterReceiver注销广播
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
五、静态注册有序广播示例
1.新建类继承BroadcastReceiver,然后在里面实现他的onReceive抽象方法
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
Intent intent=new Intent();
intent.setAction("broadcast");
sendOrderedBroadcast(intent,null);
}
});
2.分别新建项目B和项目C,新建类继承BroadcastReceiver
public class MyBroadcastReceiver extends BroadcastReceiver {
private String ATG="";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ATG,"我是你爸爸");
Toast.makeText(context, "我是你爸爸", Toast.LENGTH_SHORT).show();
}
}
public class MyBroadcastReceiver extends BroadcastReceiver {
private String ATG="";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ATG,"我是你妈妈");
Toast.makeText(context, "我是你妈妈", Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
3.在各自的AndroidManifest中注册BroadcastReceiver,这里需要注意的是需要写入priority属性设置优先级
项目B
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="1000">
<action android:name="broadcast" />
</intent-filter>
</receiver>
项目C
<receiver android:name=".MyBroadcastReceiver">
<intent-filter android:priority="-1000">
<action android:name="broadcast" />
</intent-filter>
</receiver>
六、动态注册发送无序广播示例
1.新建类继承BroadcastReceiver,然后在里面实现他的onReceive抽象方法
项目B
public class MyBroadcastReceiver extends BroadcastReceiver {
private String ATG="";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ATG,"我是你爸爸");
Toast.makeText(context, "我是你爸爸", Toast.LENGTH_SHORT).show();
}
}
项目C
public class MyBroadcastReceiver extends BroadcastReceiver {
private String ATG="";
@Override
public void onReceive(Context context, Intent intent) {
Log.e(ATG,"我是你妈妈");
Toast.makeText(context, "我是你妈妈", Toast.LENGTH_SHORT).show();
abortBroadcast();
}
}
2.与静态的差不多,唯一不同的就是把加到AndroidManifest里的写到代码里
项目B
private MyBroadcastReceiver receiver;
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(-1000);
filter.addAction("broadcast");
//动态注册广播接收器
registerReceiver(receiver, filter);
}
//取消注册
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
项目C
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_mei_tuan);
receiver = new MyBroadcastReceiver();
IntentFilter filter = new IntentFilter();
filter.setPriority(1000);
filter.addAction("broadcast");
//动态注册广播接收器
registerReceiver(receiver, filter);
}
3.回到主体类里通过sendOrderedBroadcast来启动
public void onClick(View view) {
Intent intent = new Intent();
intent.setAction("broadcast");
// sendBroadcast(intent);
sendOrderedBroadcast(intent,null);
}
});