Android30--Android之BroadcastReceiver

1.什么是BroadcastReceiver

BroadastReceiver : 广播接受者
1. 广播接收者,Android 四大组件之一,用来接收Android 系统 或者是应用程序发送出来的各种广播信息的。
2. 广播:系统/应用程序 发生状态改变的时候,需要想系统中通知其他的应用程序,进行一些操作,这个信息就是广播。

2.BroadcastReceiver的使用

BroadcastReceiver场合Service,Notification联合使用,前两者都是无UI界面的.
和其他的大部分的操作组件一样的套路.
1.定义一个类继承BroadcastReceiver,实现onReceiver()方法.
2.注册想要接受的广播.(静态注册,动态注册)
3.在OnReceiver()中实现我们想要的操作.

3.BroadcastReceiver注册的方式

1.静态注册

  1. 在清单文件中写明action中注册我们想要接受的广播.
  2. onReceiver()执行我们想执行的操作.
  3. onReceiver()方法的特点:
    onReceiver()方法:执行的时间很短,大约在10s左右..执行时间很短.
    在这个方法中不要去做一些耗时的操作.也尽量不要开启线程,因为在线程还没有执行完,onReceiver方法已经执行完了,就是造成空线程的现象,(线程衣服的进程死了).
    我们一般的操作,就是开启一个服务,把这些操作放到服务中去执行.(开启线程……..等等)

2.动态注册

  1. 我们使用context.registerReceiver(mReceiver),unregisterReceiver(mReceiver);注册,和取消广播.
  2. 在代码中定义一个BroadcastReceiver对象,对广播进行处理操作.
  3. 动态注册的广播接收者:具体由哪一个Context进行的注册,那么广播接收者的生命周期就和这个Context是一样的例如,使用Activity 注册,那么当Activity销毁,广播接收者也会销毁,不论有没有取消注册;如果使用 getApplicationContext() 注册的接收者,那么接收者就进程的生命周期一样;

4.BroadcastReceiver的广播的种类

1.无序广播

1.使用sendBroadcast方法发送
2.被所有广播接收者接收,无序,不可中断
3.广播时可设置接收者权限,仅当接收者含有权限才能接收
4.接收者的也可设置发送方权限,只接收含有权限应用的广播
作为广播的接收者,不希望任何组件都能模仿它关心的广播,因此希望在接受广播的时候能检查一下这条广播的发送者是否具有发送这条广播的资格;
这里写图片描述
5.特点: 无序 不可终止 一个广播处理完(也就是执行完onReceiver方法),再去往下传播.

2.有序广播

1.使用sendOrderedBroadcast(intent, permission)发送.
2.按照广播接收者优先级顺序,依次发送,可以在中途进行拦截;
3.广播接受者默认的优先级0<x<1,范围[-1000,1000].
4.特点:
可以进行拦截
可以在传播的时候内容发生改变(setResult()方法)
广播接收者可以设置优先级,谁的越高先收到广播消息
5.广播的执行顺序

1. 如果同一个应用中,有多个相同Action的广播接收者;并且优先级都没有设置;那么清单文件中,
    在上面的广播接收者,先执行,底部的接收者,后执行;
2. 如果一个广播接收者有优先级(>0时),另一个广播接收者没有写优先级,那么 有优先级的比没有的先执行;
3. 如果都有优先级,那么那个数字高,那个先执行;
4. sendBroadcast() sendOrderedBroadcast() 发送的广播,是向Android系统发送
    ,对于多个程序都接收相同广播的话,哪一个先安装到系统中,哪一个就先执行;
5. 哪一个广播接收者先注册、并且优先级高,就先执行

setResult的使用
这里写图片描述
这里写图片描述
如果要只想要本地操作,我们可以进行本地广播 LocalBroadcastManager

3.粘性广播(目前过时)

1.粘性广播:通过 sendStickyBroadcast 方法来发送的,发送的时候,当广播发送完成,把广播的Intent对象保存起来,当一个广播接收者在这个广播发送之后注册,那么只要注册就可以收到这个之前发送的最后一条广播.之后创建一个对象.

/**
     * 广播发送
     * @param view
     */
    public void btnSendNormal(View view) {
        // 广播消息
        Intent intent = new Intent("com.xiaohong.ACTION_TEST_0");
        Context context = this;

        // 发送无序广播
        context.sendBroadcast(intent);
        Log.d(TAG, "btnSendNormal: ");
    }

    /**
     *  有序广播
     * @param view
     */
    public void btnSendOrdered(View view) {
        Intent intent = new Intent("com.xiaohong.ACTION_TEST_1");
        // 参数二: 是定义的权限, 只有声明使用这个权限内容的广播接受者才可以接受到广播信息
        sendOrderedBroadcast(intent, "com.xiaohong.permission.TEST_1PERMISSION");
    }

    public void btnSendLocal(View view) {
        // 本地广播管理器
        LocalBroadcastManager manager = LocalBroadcastManager.getInstance(this);
        Intent intent = new Intent("com.xiaohong.ACTION_TEST_2");
        // 发送无序普通的广播
        manager.sendBroadcast(intent);
        // 发送广播, 并且等待所有的广播发送给广播接受者, 当所有广播接受者执行完成.
        // 方法才会结束
        manager.sendBroadcastSync(intent);
    }

常用的一些广播:

     <uses-permission android:name="android.permission.INTERNET"/>
    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
    <uses-permission android:name="android.permission.RECEIVE_SMS"/>
    <uses-permission android:name="android.permission.BROADCAST_SMS"/>

5.getSystemService()

这个方法是获取系统的服务,返回一个相应的manager.他是在程序一启动就有效的方法.

最后介绍一个方法:getSystemService获取系统的服务,传入一个name,返回相应的服务.
这里写图片描述
具体传出的name和返回的Manager详见官方文档.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值