前言
广播按类型分可分为全局广播和本地广播。
-
全局广播发出的广播可以被任意应用接收,或者接收任意应用的广播。
(可以静态注册也可以动态注册) -
本地广播只能在应用程序内部进行传递,广播接收器也只能接收内部的广播。
(只能动态注册,需要用到LocalBroadcastManager)
1.广播的发送
广播按发送机制分可分为标准广播和有序广播。
1.1标准广播:
一种完全异步执行的广播。在广播发出后,所有的广播接收器几乎都会在同一时刻接收到这条广播信息,因此他们之间没有任何先后顺序可言。这种广播效率较高。
1.2有序广播:
按照优先级,一级一级向下传递,接收者可以修改广播数据,也可以拦截广播事件。
1.3基本使用
Intent intent=new Intent();
//定义广播事件的类型
intent.setAction("wind.com");
//发送有序广播
sendOrderedBroadcast(intent,null);
sendOrderedBroadcast(intent,null);第一个参数是指定的意图,第二个是指定接收者的权限,不关心权限指定为null
2.广播的接收
Android中提供了一个BroadCastReceiver组件,该组件可以监听来自系统或者应用程序的广播。
使用广播接收者可以接收其他应用程序发出的广播,前提是要在本应用中创建广播接收者进行注册。
2.1广播的注册可分为动态注册和静态注册。
2.2动态注册接收广播基本实现
2.2.1方式一
public class MainActivity extends AppCompatActivity {
private IntentFilter intentFilter;
private NetworkChangeReceiver networkChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
//实例化过滤器并设置要过滤的广播 这种方式经常用来发送多个广播
networkChangeReceiver = new NetworkChangeReceiver();
intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
intentFilter.addAction(Intent.ACTION_SCREEN_OFF);
intentFilter.addAction(Intent.ACTION_SCREEN_ON);
//注册广播
registerReceiver(networkChangeReceiver, intentFilter);
}
class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if(action.equals(Intent.ACTION_SCREEN_ON)) {
Toast.makeText(context, "监听到开屏广播", Toast.LENGTH_SHORT).show();
} else if (action.equals(Intent.ACTION_SCREEN_OFF)) {
Toast.makeText(context, "监听到熄屏广播", Toast.LENGTH_SHORT).show();
} else if (action.equals("android.net.conn.CONNECTIVITY_CHANGE")) {
Toast.makeText(context, "监听到网络变化广播", Toast.LENGTH_SHORT).show();
}
}
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
}
2.2.2方式二
//常用来发送单个广播
Intent intent = new Intent("send.hello");//设了一个自定义的广播
intent.putExtra("liushi", true);//发送广播时顺便携带了一个boolean类型的数据
sendBroadcast(intent);//发送
class CustomLockReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals("send.hello")){
boolean flag = intent.getBooleanExtra("liushi");
}
}
}
2.3静态注册接收广播基本实现
在清单文件中添加
<receiver android:name=".NetReceiver"
android:enabled="true">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
新建一个接收网络变化广播的接收类
public class NetReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.d("TAG","发生调用");
}
}
如果有人实验了可能会发现我们静态注册并没有接收到广播,这是因为"android.net.conn.CONNECTIVITY_CHANGE"这个系统发出的广播在静态注册上只支持到Android7.0,高于这个版本的推荐使用动态注册的方式。(但是它可以作为一个接收广播的静态注册的案例)