Android — 之广播接收器

一、广播的概念

广播,额,顾名思义,就是…..就是广播嘛…..(别打脸,Please~~)。
广播是Android中 一种 重要的消息传输机制,消息可以是在应用程序之间,也阔以只在程序内部进行传播。在Android系统中,应用程序可以只对自己感兴趣的广播进行“注册“,这样改程序只会接收到自己所关心的广播内容(举个例子:XXX,你的快递~),但是,要接收广播就需要使用“广播接收器”(即 Broadcast Receiver)。

二、广播的分类

Android中的广播主要可以分为两种类型,标准广播(Normal broadcast)和有序广播(Ordered broadcast),可能不同的人叫法不同,但是意思应该是一样的。
标准广播:是一种异步执行的广播,在广播发出去以后,所有的广播接收器几乎会在同一时刻接收到这条广播,这种广播效率比较高,同时也无法被截断。如下图1所示。
有序广播:是一种同步执行的广播,在广播发出去以后,同一时刻只会有一个广播接收器能够接收到这条广播,当这个广播接收器中的逻辑执行完后,才会继续传递,但也有可能被当前的广播接收器截断,不再进行传播。如下图2所示。

这里写图片描述
图1.标准广播

这里写图片描述
图2.有序广播

三、广播接收器的使用

前面已经说过,若想接收广播需要使用广播接收器,广播接收器可以自由的对自己感兴趣的广播进行注册,注册的方式一般可分为两种:一是在代码中进行注册,也称为动态注册;一是在AndroidManifest.xml文件中注册,也被称为静态注册。所接收的广播可以是系统发出的广播,也可以是应用程序发出的自定义广播。

上面提出的新概念有很多,什么标准广播,有序广播,动态广播,静态广播,系统广播,自定义广播,真是让人蛋疼的啊,那我们只能通过代码,来一一进行解释了。

1). 广播接收器

不管要接收什么样的广播,我们都需要使用广播接收器,啰嗦这么多,到底怎么创建一个广播接收器呢?方法并不复杂,只需要实现一个类,一个继承自BroadcastReceiver的类,并重写父类的onReceive()方法就行了,因为接收到感兴趣的广播的时候,该方法会得到执行,即可去做你希望的想做的事情。不过!!!不要在 onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的,当 onReceive()方法运行了较长时间而没有结束时,程序就会报错。它的生命周期大概只有10秒左右!!

如:当我接收到广播的时候的,使用Toast弹出一个提醒。

package com.yu.brocasttext;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.widget.Toast;

public class MyBroadcastReceiver extends BroadcastReceiver {
   

    @Override
    public void onReceive(Context context, Intent intent) {

        Toast.makeText(context, "Receiverd in MyBroadcatReceiver", Toast.LENGTH_SHORT).show();

    }

}

当然,若是想弹出提醒,前提是得接收到感兴趣的广播才行,那么问题来了,该怎么注册感兴趣的广播呢?我们接下来分类(静态和动态)进行阐述。

2). 动态注册广播

例.使用动态注册的方式编写一个能够监听网络变化的广播程序
MainActivity.java :

package com.yu.brocasttext;

import android.app.Activity;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.Bundle;
import android.util.Log;
import android.widget.Toast;

public class MainActivity extends Activity {
   

    private IntentFilter intentFilter;
    private NetworkChangeReceiver networkChangeReceiver;    

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        Log.d("BroadcastText", "run at boot");
        setContentView(R.layout.activity_main);


        //动态注册广播  接收系统广播
        //构建IntentFilter实例
        intentFilter = new IntentFilter();
        //为IntentFilter添加感兴趣的action ;  当网络状态发生变化时,
        //系统发出的正是一条值为 android.net.conn.CONNECTIVITY_CHANGE 的广播
        intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
        //创建(网络变化)广播接收器对象
        networkChangeReceiver = new NetworkChangeReceiver();
        //注册广播接收器
        registerReceiver(networkChangeReceiver, intentFilter);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        //动态注册的广播一定注意要取消注册,否则可能会造成内存泄漏
        unregisterReceiver(networkChangeReceiver);
    }

    //构建一个继承自BroadcastReceiver的类,当网络发生变化时会收到广播
    class NetworkChangeReceiver extends BroadcastReceiver {

        @Override
        public void onReceive(Context context, Intent intent) {
            //获取ConnectivityManager实例,这是一个系统服务类,专门用于管理网络连接
            ConnectivityManager connectionManager = (ConnectivityManager) 
                    getSystemService(Context.CONNECTIVITY_SERVICE);
            //获取NetWorkInfo实例
            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
            //判断网络当前是否可用
            if(networkInfo != null && networkInfo.isAvailable()) {
                Toast.makeTe
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值