BroadcastReceiver
BroadcastReceiver是Android四大组件之一,分为接收方和发送方,就算没有接收方发送方也会发送数据。
BroadcastReceiver可以实现多个页面的数据通信,实现跨进程之间的数据通信。
广播分类:
- 无序广播:不管有多少接收者,一旦发出无序广播,所有监听此广播的接收者都能接收到;
- 有序广播:按照接收者的优先级,逐一传递,优先级最高者最先接收,如果不终止此广播,再往下传递。
- 粘滞广播:当广播发出后,如果系统没有接收者,会一直等待有接收者接送。
静态注册无序广播
步骤:
- 新建类继承BroadcastReceiver;
- 实现onReceive方法;
- 在Manifest里注册BroadcastReceiver,结构如下
<receiver android:name=".Zhifubao">
<intent-filter>
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
常用方法和标签:
- onReceive方法:广播的接收者;
- action:注册时设置监听动作(频道);
sendBroadcast:发送一个无序广播,此方法需要一个Intent的参数,调用Intent的对象的setAction方法,设置要发送的频道。
代码演示:
Activity发送方:
public class MainActivity extends AppCompatActivity {
private Button abtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
abtn = findViewById(R.id.aa_btn);
abtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//参数是Manifest里面action的name
Intent intent = new Intent("zhifubao");
sendBroadcast(intent);//无序广播
}
});
}
}
接收方:
public class Zhifubao extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();
Log.e(TAG, "zhifubao" + date);
}
}
在Manifest中注册:
<receiver android:name=".Zhifubao">
<intent-filter>
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
动态注册的无序广播
步骤:
- 新建类TestBroadcast继承BroadcastReceiver;
- 实现onReceive方法;
- 在代码中实例化TestBroadcast广播类;
- 在代码中实例化IntentFilter。
常用方法 :
- IntentFilter方法:告诉安卓系统自己能够处理哪些请求;
- addAction:注册时设置监听动作(频道);
- registerReceiver:注册广播;
unregisterReceiver:使用动态注册时,在程序推出前一定要调用此注销方法。
代码演示:
Activity发送方:
public class MainActivity extends AppCompatActivity {
private Button abtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
abtn = findViewById(R.id.aa_btn);
abtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//参数是Manifest里面action的name
Intent intent = new Intent("zhifubao");
//无序广播
sendBroadcast(intent);
}
});
}
}
接收方的新建类Zhifubao:
public class Zhifubao extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();
Log.e(TAG, "zhifubao" );
}
}
接收方中的Activity:
public class MainActivity extends AppCompatActivity {
private Zhifubao zhifubao;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//动态无序广播
zhifubao=new Zhifubao();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("zhifubao");
registerReceiver(zhifubao,intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//解除广播
unregisterReceiver(receiver);
}
}
静态注册的有序广播
步骤:
- 新建两个类继承BroadcastReceiver;
- 实现onReceive方法;
- 在代码中实例化类;
- 在代码中实例化IntentFilter;
常用方法和标签:
- priorty属性:设置广播的优先级,此属性连接一个int类型,取值范围-1000-1000,如果优先级一样,最先注册的广播先接收;
- sendOrderedBroadcast方法:发送一个有序广播,优先级最高的广播最先接收到;
- setResultExtras方法:此方法在onReceive内部使用,代表继续往下一级传递有序广播;
abortBroadcast方法:此方法在onReceive内部使用,如果不想继续传递,使用此方法结束广播。
代码演示:
Activity发送方:
public class MainActivity extends AppCompatActivity {
private Button abtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
abtn = findViewById(R.id.aa_btn);
abtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//参数是Manifest里面action的name
Intent intent = new Intent("zhifubao");
// 有序广播
sendOrderedBroadcast(intent, null);//自定义权限,有序广播
}
});
}
}
接收方Zhifubao:
public class Zhifubao extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();//当这个广播先收到不想让下一个收到广播,就用这个语句
}
在Manifest中注册:
<receiver android:name=".Zhifubao">
//静态有序广播用来调整顺序
<intent-filter android:priority="1000">
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
接收方Meituan:
public class MainActivity extends AppCompatActivity {
private MeiTuan meituan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
meituan=new MeiTuan();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("zhifubao");
//接收先后顺序
intentFilter.setPriority(-1000);
registerReceiver(meituan,intentFilter);
}
@Override
protected void onDestroy() {
//动态有序广播用来终止广播
super.onDestroy();
unregisterReceiver(meituan);
}
}
在Manifest中注册:
<receiver android:name=".Zhifubao">
//静态有序广播用来调整顺序
<intent-filter android:priority="-1000">
<action android:name="zhifubao"/>
</intent-filter>
</receiver>
动态注册的有序广播
步骤:
- 新建两个类继承BroadcastReceiver;
- 实现onReceive方法;
- 在代码中实例化类;
- 在代码中实例化IntentFilter;
常用方法和标签:
- priorty属性:设置广播的优先级,此属性连接一个int类型,取值范围-1000-1000,如果优先级一样,最先注册的广播先接收;
- sendOrderedBroadcast方法:发送一个有序广播,优先级最高的广播最先接收到;
- setResultExtras方法:此方法在onReceive内部使用,代表继续往下一级传递有序广播;
abortBroadcast方法:此方法在onReceive内部使用,如果不想继续传递,使用此方法结束广播。
代码演示:
Activity发送方:
public class MainActivity extends AppCompatActivity {
private Button abtn;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
abtn = findViewById(R.id.aa_btn);
abtn.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
//参数是Manifest里面action的name
Intent intent = new Intent("zhifubao");
//sendBroadcast(intent);//无序广播
//有序广播
sendOrderedBroadcast(intent, null);//自定义权限,有序广播
}
});
}
}
接收方Activity:
public class MainActivity extends AppCompatActivity {
private Zhifubao zhifubao;
private Zhifubao meituan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
/**
* 第一个接收方
*
* */
//动态无序广播
zhifubao=new Zhifubao();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("zhifubao");
//接收先后顺序
intentFilter.setPriority(1000);
registerReceiver(zhifubao,intentFilter);
/**
* 第二个个接收方
*
* */
//动态无序广播
meituan=new MeiTuan();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("zhifubao");
//接收先后顺序
intentFilter.setPriority(-1000);
registerReceiver(meituan,intentFilter);
}
@Override
protected void onDestroy() {
//动态无序广播用来终止广播
super.onDestroy();
unregisterReceiver(zhifubao);
}
}
接收方Zhifubao:
public class Zhifubao extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Toast.makeText(context, " 喊我干嘛", Toast.LENGTH_SHORT).show();
//终止广播
abortBroadcast();//当这个广播先收到不想让下一个收到广播,就用这个语句
}
接收方Meituan:
public class MainActivity extends AppCompatActivity {
private MeiTuan meituan;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
meituan=new MeiTuan();
IntentFilter intentFilter=new IntentFilter();
intentFilter.addAction("zhifubao");
//接收先后顺序
intentFilter.setPriority(-1000);
registerReceiver(meituan,intentFilter);
}
@Override
protected void onDestroy() {
//动态有序广播用来终止广播
super.onDestroy();
unregisterReceiver(meituan);
}
}
注意:
静态注册无序广播和动态注册无序广播区别:
静态注册:这种方式的注册是常驻型的,也就是说当应用关闭后,如果有广播信息传来,也会被系统调用而自动运行。
动态注册:不是常驻型的,也就是说广播会跟随程序的生命周期。
动态注册发送有序、无序广播的比较:
- 在广播动态注册时,调用InterFilter对象的setPriority方法设置优先级;
- 在有Context环境中通过sendOrderedBroadcast;
- 有序广播可以根据优先级决定广播是否继续。