什么是BroadcastReceiver广播
- 分为广播发送,广播接收(发送方,接收方),(没有接收方,发送方也会发送数据)
- android四大组件之一
- 跨多个页面
- 跨多个进程/多个app
分类
- 无序广播:同时接收,没有先后顺序
- 有序广播:按照顺序,优先级,逐一传递
- 粘滞广播:没有接收者会一直等待,直到接收者接收
注册方式
- 静态注册:这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,MyReceiver也会被系统调用而自动运行
- 动态注册:非常驻型,需要时调用才能运行
如何使用广播
静态注册无序广播:
- 新建一个新的工程发送广播,
- 新建另一个新的工程作为接收方,新建一个实体类继承BroadcastReceiver,在接收方AndroidManifest注册BroadcastReceiver
<receiver android:name=".MyReceiver">
<intent-filter>
<action android:name="zhifubao"/>//发送广播传值的名字
</intent-filter>
</receiver>
发送方
sendActivity:
public class SendActivity extends AppCompatActivity {
private Button messageBtn;
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send);
messageBtn=findViewById(R.id.message_btn);
messageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("zhifubao");
sendBroadcast(intent);
}
});
接收方
MainActivity:不做修改
新建一个MyReceivediver实体类:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "叫我干啥", Toast.LENGTH_SHORT).show();
}
AndroidManifest添加:
<receiver android:name=".MyReceiver">
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
动态注册无序广播
发送方不做修改
接收方
将之前AndroidManifest添加的删除,不做修改
MainActivity在之前的基础上修改接收方
public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("zhifubao");
//动态注册广播接收器
registerReceiver(receiver, filter)
静态注册有序广播
在接收方新建一个新的实体类MyReceiver
发送方:
SendActivity:
public class SendActivity extends AppCompatActivity {
private Button messageBtn;
private Button messageBtn2;
@Override
public void onCreate( Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_send);
messageBtn=findViewById(R.id.message_btn);
messageBtn2=findViewById(R.id.message2_btn);
messageBtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("zhifubao");
sendBroadcast(intent);
}
});
//静态有序发送
messageBtn2.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent=new Intent("zhifubao");
//重点修改的地方
sendOrderedBroadcast(intent,null);//自定义权限
}
});
}
接收方
AndroidManifest添加:
<receiver android:name=".MyReceiver">
<intent-filter android:priority="1000"> //设置先后顺序
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
<receiver android:name=".MyReceiver2">
<intent-filter android:priority="-1000">//设置先后顺序
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
MyReceiver:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "叫我干啥", Toast.LENGTH_SHORT).show();
}
MyReceiver2:
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "消息2接收到了", Toast.LENGTH_SHORT).show();
}
动态注册有序广播
发送方不做修改
接收方:
AndroidManifest之前添加的全都屏蔽
MainActivity:
public class MainActivity extends AppCompatActivity {
private MyReceiver receiver;
private MyReceiver2 receiver2;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态注册
receiver = new MyReceiver();
IntentFilter filter = new IntentFilter();
filter.addAction("zhifubao");
//重点添加修改,将静态注册有序广播转换为动态有序广播的操作
filter.setPriority(1000);//设置先后顺序
//动态注册广播接收器
registerReceiver(receiver, filter);
receiver2=new MyReceiver2();
IntentFilter filter1=new IntentFilter();
filter1.addAction("zhifubao");
//重点添加修改,将静态注册有序广播转换为动态有序广播的操作
filter.setPriority(-1000);//设置先后顺序
//动态注册广播接收器
registerReceiver(receiver2,filter1);
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(receiver);
}
}
MyReceiver:
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "叫我干啥", Toast.LENGTH_SHORT).show();
Log.e("MyReceiver","1111111111111");//以显示接收广播先后顺序
abortBroadcast();//终止广播进行到MyReceiver2
}
}
MyReceiver2:
public class MyReceiver2 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, "消息2接收到了", Toast.LENGTH_SHORT).show();
Log.e("MyReceiver2","22222222222");//以显示接收广播先后顺序
}
}