Android提供了一套完整的API,允许应用来自由的发送+和接受广播。而广播接收者只需要关注广播的内容,而不需要关心广播是由谁发送的。广播发送是通过intent发送,广播接收者主要分成两类:标准广播,有序广播。
标准广播:一种完全异步执行的广播,在广播发出后,所以广播接收器机会在同一时间接收到这条广播消息,没有优先级。这种广播效率比较高,不会检测优先级,同时也是无法被截断的。如下图(随手画)
有序广播:一种同步执行的广播,在广播发出之后,同一时刻只有一个广播(优先级)能够接收到这条广播,当这个广播的逻辑执行后,广播才会往下传递。所有的广播接收者是有先后顺序接受的,优先级高广播最先接受到广播,当执行完逻辑后并有权是否继续往下传递,既可以拦截广播。如下图
广播的两种注册方式:
- 动态注册:在代码中注册广播接收者,继承BroadcastReceiver,并重写父类方法onReceiver()方法,当有广播接收时,会执行该方法,具体逻辑可以在里面处理。
例子(监听网络变化的例子):
public class MainActivity extends AppCompatActivity {
private NetworkChangerReceiver networkChangerReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
IntentFilter intentFilter = new IntentFilter();
//当网络变化的时候,系统会发送一下广播"android.net.conn.CONNECTIVITY_CHANGE"
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangerReceiver = new NetworkChangerReceiver();
registerReceiver(networkChangerReceiver, intentFilter);
}
@Override
protected void onDestroy() {
super.onDestroy();
//动态注册广播,一定要注意注销
unregisterReceiver(networkChangerReceiver);
}
class NetworkChangerReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
//记得增加权限
// <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
//获取网络状态
NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
if(activeNetworkInfo != null && activeNetworkInfo.isAvailable()){
Toast.makeText(MainActivity.this, "nice,终于来网了", Toast.LENGTH_SHORT).show();
}else{
Toast.makeText(MainActivity.this, "shut,网又断了了", Toast.LENGTH_SHORT).show();
}
}
}
}
- 静态注册:静态注册虽然没有动态注册的灵活性,但必须需要在程序启动的时候才行,而静态注册可以在程序未启动的情况下接收到广播。
例子:创建一个开机启动的广播接收
请单文件AndroidMainifest.xml的application下注册
<receiver
android:name=".MyReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action android:name="android.intent.action.BOOT_COMPLETED"></action>
</intent-filter>
</receiver>
enabled 表示这个是否启用这个广播接收者
exported 表示是否允许这个广播接收者能接收本程序以外的广播
“android.intent.action.BOOT_COMPLETED”:系统启动的广播
还记得要加开机权限
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
public class MyReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
// TODO: This method is called when the BroadcastReceiver is receiving
// an Intent broadcast.
Toast.makeText(context,"哇,启动了啊",Toast.LENGTH_SHORT).show();
throw new UnsupportedOperationException("Not yet implemented");
}
}