Android学习记录13————BroadcastReceiver

BroadCastReceiver是Android四大组件之一,主要用于接收系统或者app发送的广播事件。广播分为两种:标准广播和有序广播。
标准广播: 是一种完全异步执行的广播,广播发出之后,所有广播接收器几乎都会在同一时刻接收到这条广播消息,所有它们之间没有先后顺序可言。
有序广播: 是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,并且前面的广播接收器还可以截断正在传递的广播。

广播接收器的使用

在我们Android系统中内置了很多系统级别的广播,我们可以在程序中通过监听这些广播来得到各种系统的状态信息。如果想接收到这些广播,就需要使用到广播接收器。广播接收器的注册方式分为两种,动态注册和静态注册,先来看一下动态注册。下面写一个监听网络变化的例子

首先新建一个类让他继承自BroadcastReceiver,并重写父类的onReceive()方法,当有广播到来时,onReceive()方法就会执行。代码如下

public class MyReceiver 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();
        }
    }
}

首先通过getSystemService()方法得到ConnectivityManager的实例,这是一个系统服务类,用于管理网络连接,然后调用它的getActiveNetworkInfo()方法获得NetworkInfo的实例,接着调用NetworkInfo的isAvailable()方法判断当前是否有玩网络。

接下来修改MainActivity中的代码

public class MainActivity extends AppCompatActivity {

    private IntentFilter intentFilter;

    private MyReceiver myReceiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        intentFilter = new IntentFilter();
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        myReceiver = new MyReceiver();
        registerReceiver(myReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        unregisterReceiver(myReceiver);
    }
}

首先我们创建了一个IntentFilter的实例,并添加了一个值为android.net.conn.CONNECTIVITY_CHANGE的action,这个是当系统网络状态发生改变时,系统发出的一条值为android.net.conn.CONNECTIVITY_CHANGE的广播,我们添加相应的action,就可以监听到什么广播。接下来创建我们上面新建的MyReceiver的实例,然后调用registerReceive()方法进行注册,将MyReceiver的实例和IntentFilter的实例传进去,这样就实现了网络的监听。动态注册的广播接收器一定要取消注册,在onDestory(0中调用unregisterReceiver()来实现。最后别忘了声明权限

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

上面是动态注册。动态注册的广播接收器可以自由控制注册和注销。下面介绍一下静态注册:只需要在清单文件中进行注册, <intent-filter>里添加相应的action即可。

		<receiver
            android:name=".MyReceiver"
            android:enabled="true"
            android:exported="true">
            <intent-filter>
                <action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
            </intent-filter>
        </receiver>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值