全局大喇叭 广播机制

  • 广播机制简介
  • Android中的广播机制更加灵活,因为它可以对它感兴趣的广播进行注册,这样程序就只会接收它感兴趣的广播了,这些广播可能来源与系统,也可以来源于其它应用程序。发送广播使用Intent,而就收广播使用广播接受器(Broadcast Receiver)。
  • 广播的类型:标准广播和有序广播

标准广播:是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时间接受到这条广播消息。因为它们没有任何的先后顺序而言。这种广播的效率比较高,同时也意味着无法被截断。

标准广播的流程图

有序广播 :是一种同步执行的广播,在广播发出去之后,在同一时刻,只能有一个广播接收器能够接收到这条广播消息,当这个广播接收器中的逻辑执行完成后,广播才会继续执行。所有此时的广播接收器都是有先后顺序的,优先级高的广播就可以先收到消息,并且前面的广播接收器还可以截断正在传递的广播。这样后面的广播接收器就无法接收到消息了。
这里写图片描述

接收系统广播
Android内置了很多系统级别的广播,列如 手机开机时会发出一条广播,电池电量发生变化时会发出一条广播,如果想要接收这些广播,就要使用广播接收器。

注册广播的方式:在代码中注册和在AndroidManifest.xml中注册,前者称为动态注册,后则称为静态注册。

  1. 动态注册监听网络变化
public class MainActivity extends AppCompatActivity {

    private BroadcastReceiver broadcast1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        broadcast1 = new MyBroadcast1();
        //动态注册广播,要监听的action
        IntentFilter intentFilter = new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE");
        //注册广播
        registerReceiver(broadcast1,intentFilter);

    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //取消注册
        unregisterReceiver(broadcast1);

    } }

public class MyBroadcast1 extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {

    //接收到广播处理的事情

     ConnectivityManager connectivityManager =
    (ConnectivityManager)context.getSystemService(Context.CONNECTIVITY_SERVICE);

    NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo();

//判断网络连接的状态
if(networkInfo != null && networkInfo.isAvailable()){
Toast.makeText(context,”连接正常”,Toast.LENGTH_SHORT).show();

  }else{

      Toast.makeText(context,"无服务",Toast.LENGTH_SHORT).show();

  }
}

}

“`
1. 需要注意的是,动态注册的广播接收器一定要在onDestory()方法中取消注册才可以。
2. 这里我们指定的action是 android.net.conn.CONNECTIVITY_CHANGE
在网络发生变化时,系统就会发出这样一条广播。通过registerReceiver方法,就将我们要监听的广播和 广播接收器的实例传递进去,实现了监听网络变化的功能。
3. 通过context.getSystemService方法来得到系统服务类专门用于管理网络连接的,通过getActiveNetworkInfo()可以得到NetworkInfo的实例,接着判断当前的网络状态。
4. 查询网络状态需要权限,在AndroidMainfestz中添加权限

android.permission.ACCESS_NETWORK_STATE”/>

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值