安卓开发 四大组件之广播

广播,是一个全局的监听器,属于Android四大组件之一

广播的分类:

标准广播:一种完全异步执行的广播,再广播发出之后,所有的广播接收器机会都会在同一时刻接收到这条广播消息。因此没有任何先后顺序可言。这种广播的效率会比较高,但是同时也意味着他是无法被截断的。标准广播的工作流程

有序广播:一种同步执行的广播,当广播发出后,同一时刻只会有一个广播接收器能收到这条广播,当广播接收器的逻辑执行完后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息饿了。有序广播的工作流程

 

系统广播:系统自带的广播

 

自定义标准广播:

(1)      新建一个Intent对象,把广播的名字传入

(2)      SendBroadcast来发送广播

自定义有序广播:

(1)      新建一个Intent对象,把广播名字传入

(2)      SendBroadcast来发送广播,第二个参数为权限相关字符

以上创建完和标准广播没有区别

(3)      可以设置优先级

(4)      可以在接收器的活动中设置是否允许广播继续传递(此处为截断)

系统广播

系统操作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

注:当使用系统广播时,只需要在注册广播接收者时定义相关的action即可,并不需要手动发送广播,当系统有相关操作时会自动进行系统广播


广播接收器的注册一般有两种:在代码中注册(动态注册)和AndroidMainfest.xml中注册(静态注册)

广播接收器的注册:

新建一个类,让他继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。onReceive()方法再收到广播时就会被执行,所以可以在onReceiver中写少部分逻辑。

注:因为再广播接收器中不允许开启线程,所以再其中执行过多的耗时操作,程序会报错。因此广播接收器跟多的时扮演一种打开其他程序组件的角色

动态广播接收器的基本用法:

(1)      新建一个IntentFilter的实例,并给他添加一个action(广播接收器想要听到的广播)

(2)      自定义一个广播接收器,并且实例化,再其中的onReceiver中写逻辑

(3)      调用registerReceiver方法进行注册,把前两步的实例传进去。这样你的自定义广播接收器在收到设定的广播后就会调用方法。

 

以上为系统全局广播,激发出的广播可以被其他任何应用程序接收到,并且我们也可以接收到来自于其他任何应用程序的广播。这样会引起安全问题,所以引入了本地广播

本地广播:广播只能在应用程序的内部传递,并且广播接收器也只能接收到来自本应用程序发出的广播,这样所有的安全问题就不存在了。本地广播接收器只能动态注册,因为静态注册后活动未启动,不可能接收广播

本地广播的用法(用法和全局基本一致,只是多了个Manager):

(1)      获得一个LocalBroadcatManager实例来对广播进行管理

(2)      使用LocalReceiver来创建本地接收器,使用LocalBroadcastManager的实例来进行广播的发送。

(3)      别忘记程序结束了注销接收器

例子如下

public class MainActivity extendsAppCompatActivity {
    private IntentFilterintentFilter;
    private NetWorkChangeReceivernetWorkChangeReceiver;
    private LocalReceiverlocalReceiver;
    private LocalBroadcastManagerlocalBroadcastManager;


    //在intentFilter中写入我们需要的动作
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        localBroadcastManager=LocalBroadcastManager.getInstance(this);//获得实例
        Button button=findViewById(R.id.button);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(Viewv) {
                Intent intent=new Intent("com.example.broadcasttest.LOCAL_BROADCAST");
                localBroadcastManager.sendBroadcast(intent);
            }
        });
        intentFilter=new IntentFilter();
        intentFilter.addAction("com.example.broadcasttest.LOCAL_BROADCAST");
        localReceiver=new LocalReceiver();
        localBroadcastManager.registerReceiver(localReceiver,intentFilter);//注册本地广播监听器
    }

    //每次程序结束需要需要注册的广播
    @Override
    protected void onDestroy() {
        super.onDestroy();
        localBroadcastManager.unregisterReceiver(localReceiver);
    }

    private class LocalReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Contextcontext, Intent intent) {
            Toast.makeText(context,"received local broadcast",Toast.LENGTH_SHORT).show();
        }
    }
}



想要了解广播定义及相关原理的可以看下这一篇BroadcastReceiver史上最全面解析


 




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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值