Android 四大组件(三)Broadcast 广播 详解

官网给的定义很准确:Android 应用与 Android 系统和其他 Android 应用之间可以相互收发广播消息,这与发布-订阅设计模式相似。这句话,可能你一开始不太理解,还没get到它的准确,你记得看完文章,或者你真正了解了广播,再回头看这句话,那个感觉就有了。

作为开发者经常用到广播的场景一:自定义广播接受者,在应用的一个地方发送广播,在另外一个地方接受广播做事情。很方便(但很消耗资源,最好别这样,EventBus了解一下,我们这里只是用来说明广播)。

按注册方式分为:静态注册广播

先自定义  广播接受者  继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)

/**
 * description:
 *
 * @author zhouzhihao
 * @time 2020/12/7 0007
 */
public class TestBroadcastRecerver extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"我是静态广播接受者",Toast.LENGTH_SHORT).show();
    }
}

在AndroidManifest.xml 中声明

在需要的地方,发送广播,如果需要action过滤,就在intent里面addAction。

priority是控制广播优先级的,值越大,优先级越高,越早接到广播。

  //测试静态广播
        sendBroadcast(new Intent(this, TestBroadcastRecerver.class));

动态注册广播

先自定义  广播接受者  继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)

/**
 * description:
 *
 * @author zhouzhihao
 * @time 2020/12/7 0007
 */
public class DynamicBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"我是动态注册广播接受者",Toast.LENGTH_SHORT).show();
    }
}

然后注册的时候,

        //动态广播   第一种
        IntentFilter intentFilter=new IntentFilter();
        intentFilter.addAction("com.dynamic");
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(dynamicBroadcast,intentFilter);


       //动态广播第二种(推荐)

     LocalBroadcastManager localBroadcastManager=LocalBroadcastManager.getInstance(context);
    localBroadcastManager.registerReceiver(dynamicBroadcast,intentFilter);
        Intent intent=new Intent();
        intent.setAction("com.dynamic");
        localBroadcastManager.sendBroadcast(intent);

动态注册和静态注册的区别,动态注册的生命周期跟随它所在的那个activity做的动态注册的生命周期。

有两种官网是这样说的,所以推荐用第二个。而Android 9  api 28   会没有这个LocalBroadcastManager,  如果你是这种情况,网上的做法是加入android -v4的包,加入后,android  studio 会提示你用androidx   所以你就用   

implementation 'androidx.localbroadcastmanager:localbroadcastmanager:1.0.0'

附上官网链接:广播概览  |  Android 开发者  |  Android Developers

场景二:接收Android系统发送的一些系统广播,比如下载apk包做更新时,下载完成文件后系统会发送下载完成的广播,这样应用就能在收到广播后做一些操作逻辑,下面是Android的各种系统广播:

系统操作action
监听网络变化android.net.conn.CONNECTIVITY_CHANGE
关闭或打开飞行模式Intent.ACTION_AIRPLANE_MODE_CHANGED
充电时或电量发生变化Intent.ACTION_BATTERY_CHANGED
电池电量低Intent.ACTION_BATTERY_LOW
电池电量充足(即从电量低变化到饱满时会发出广播Intent.ACTION_BATTERY_OKAY
系统启动完成后(仅广播一次)Intent.ACTION_BOOT_COMPLETED
按下照相时的拍照按键(硬件按键)时Intent.ACTION_CAMERA_BUTTON
屏幕锁屏Intent.ACTION_CLOSE_SYSTEM_DIALOGS
设备当前设置被改变时(界面语言、设备方向等)Intent.ACTION_CONFIGURATION_CHANGED
插入耳机时Intent.ACTION_HEADSET_PLUG
未正确移除SD卡但已取出来时(正确移除方法:设置--SD卡和设备内存--卸载SD卡)Intent.ACTION_MEDIA_BAD_REMOVAL
插入外部储存装置(如SD卡)Intent.ACTION_MEDIA_CHECKING
成功安装APKIntent.ACTION_PACKAGE_ADDED
成功删除APKIntent.ACTION_PACKAGE_REMOVED
重启设备Intent.ACTION_REBOOT
屏幕被关闭Intent.ACTION_SCREEN_OFF
屏幕被打开Intent.ACTION_SCREEN_ON
关闭系统时Intent.ACTION_SHUTDOWN
重启设备Intent.ACTION_REBOOT

其中我试了Intent.ACTION_SCREEN_ON,注意不能使用静态注册的方式,必须采用动态注册的方式才有效。

先自定义  广播接受者  继承BroadcastReceiver 类,然后重写onReceive方法(做接收到广播的逻辑操作)

/**
 * description:
 *
 * @author zhouzhihao
 * @time 2020/12/7 0007
 */
public class DynamicBroadcast extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context,"我是动态注册广播接受者",Toast.LENGTH_SHORT).show();
    }
}

然后注册的时候,加上Intent.ACTION_SCREEN_ON

        IntentFilter intentFilter=new IntentFilter();
     
        intentFilter.addAction(Intent.ACTION_SCREEN_ON);
        registerReceiver(dynamicBroadcast,intentFilter);

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值