Android开发四大组件之广播篇(BroadcastReciver)

Android开发四大组件之广播篇(BroadcastReciver)

一.什么是广播?

广播(广而播之):在90年代的贫困山村里,广播成了村村必备之良品;村书记一有啥事,就通过挂在村头的大喇叭发言,通知村里的小老百姓;拆分出来这广播的步骤就这两种,如下图所示;

注意这里的小老百姓(广播接收者)是指在村里的,可以接收到村里广播的有效百姓;

二.Android中广播

1.Android的广播是什么?

在Android中的广播和现实生活的广播性质都差不多,都是向用户/接收者传递一些信息/数据,然后用户/接收者会根据得到的信息作出相应的反馈动作,当然这反馈动作不是必要性的;

2.Android中广播的应用场景

  • 组件之间的通行(应用内或多个应用之间的通信);
  • 多线程之间的通信(比如:UI线程和次线程,次线程和次线程);次线程是指新开的线程
  • 组件和系统之间的通信(比如网路变化,是否开机等系统机制)

3.Android中广播的分类

  • 全局广播和局内广播:全局广播表示该广播可以通知/接收其他应用,局内广播是指广播的通知和接收只能在在同一个应用中处理;
  • 有序广播和无序广播:有序广播是指按照一定顺序的优先级,一个一个的进行传递,可以修改广播数据,终止广播传递;无序广播是指没有顺序优先级,任何接收者都能无时效性的接收传递的广播,这种类型的广播不能被修改数据和终止传递;
  • 自定义广播和系统广播:设置自定义广播不具有约束性,自己想怎样设置都行;设置系统广播具有约束性,只能按照定义的规则设置;(注意:实现自定义/系统广播的步骤都是一样的,都是通过设置action来标识广播,只不过系统广播中对action的设置只能按照约束的规则来设置,自定义广播则不需要);

4.在Android中怎样实现广播?

在Andorid要实现一个完整的广播机制,必须要定义广播的接收者(注册广播)和发送者(发送广播),这样才能算是有效的,可行的广播功能;

怎样定义广播的接收者(注册广播)?

注册广播:注册广播分为静态注册和动态注册;

  • 静态注册:是在AndroidMainFest.xml文件中配置需要注册的广播;在Android Studio中可以通过新建广播功能,会自动化的在AndroidMainFest.xml自动配置注册的广播,同时会在相应的包内生成BroadcastReceiver子类,在该子类中的onReceive的方法中进行数据处理,当然也可以手动配置;配置代码如下:
<receiver android:name=".testReceiver" android:exported="true" android:enabled="true"> 
    <intent-filter> 
        <!--这里设置的action是为系统广播(表示网络发生变化)-->
        <action android:name="com.net.conn.CONNECTIVITY_CHANGE" /> 
    </intent-filter>
</receiver>
/*自定义广播接收者,继承BroadcastReceiver类*/
class TestReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(){
        //dosomething
    }
}
  • 动态注册:是通过继承BroadcastReceiver类并重写onReceive()方法来动态注册广播的,当然也可以直接实例化BroaderReciver类来实现;步骤:先实例化BroadcastReceiver类或该类子类,通过IntentFilter类实例化广播标识,最后通过regin
//方式一:实例化BroadcastReceiver类,定义广播接收者
BroaderReciver bReceiver=new BroadcastReceiver(){
    //该方法用来获取传递的广播
    @Override
    public void onReceive(Content content,Intent intent){
        //dosomething
    }
}
/*动态注册广播*/
IntentFilter iFilter=new IntentFilter();
//定义广播标识-这里是系统广播标识
iFilter.addAction("com.net.conn.CONNECTIVITY_CHANGE");
//注册广播
registerReceiver(bReceiver,iFilter);


//方式二:继承BroadcastReceiver类,定义广播接收者
class TestBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Content content,Intent intent){
        //donsomething
    }
}
//实例化BroadcastReceiver子类TestBroadcastReceiver
TestBroadcastReceiver testBReceiver=new TestBroadcastReceiver();
/*动态注册广播*/
IntentFilter iFilter=new IntentFilter();
//定义广播标识-这里是系统广播标识
iFilter.addAction("com.net.conn.CONNECTIVITY_CHANGE");
//注册广播
registerReceiver(testBReceiver,iFilter);

以上代码处理实例化BroadcastReceiver类的方式不一样,其他方式都是一样的;;

静态注册和动态注册的共同点和不同点是什么?

共同点:他们都可以用于自定义广播或系统广播注册;

不同点:动态注册最终通过registerReceiver()方法进行注册,所以它相应的也有释放/销毁广播的方法(unregisterReceiver);而静态注册则不能手动释放/销毁广播;

unregisterReceiver(testBReceiver); //这样就可以销毁广播了

建议:对于系统级别的,重复使用频率高的广播,例如网络变化广播,建议使用静态注册;相反,对于自定义,使用频率低的广播,建议使用动态注册;这样不用了了可以通过unregisterReceiver方法进行释放资源,防止内存泄漏;

(注意:对于unregisterReceiver()方法的使用建议在Activity中的onPause()声明周期中使用,因为当手机内存不足要回收Activity资源时,有可能执行到onPause()生命周期就销毁Activity,而不会执行onStop()和onDetory()这两个生命周期方法,也就是说,如果在onStop()或onDetory()调用unregisterReceiver()方法时,在出现上述情况下,有可能回收失败,赵成内存泄漏,所以最安全的方式是在onPause()方法中使用)

怎样定义广播的发送者(发送广播)?

发送广播相对注册广播要简单的多,无非是调用sendBroadcast(Intent intent)就能发送了;有点需要注意:系统广播发送是由系统自行的行为,不需要通过sendBroadcast()方法;自定义广播就必须要通过此方法进行广播发送;

Intent intent=new Intent();
//标识发送的广播,跟动态注册的addAction()或静态注册的action配置名称保持一致性
intent.setAction("defineTestBroadCast");
sendBroadcast(intent);//广播发送出去了

5.给广播添加权限

 

就是在定义广播时,可以对广播进行权限验证;自定义广播可以通过自定义权限进行权限设置,系统广播一般需要相应的权限才能获取到系统功能;注意广播接收和发送都需要使用权限;注册广播时的权限使用方式;这里以自定义广播来做实例:

自定义权限

<permission android:name="com.permissions.MY_BROADCAST" android:protectionLevel="signature" ></permission>

静态注册权限设置

<recevier
android:name=".testReceiver"
android:exported="true"
android:enabled="true"
android:permission="com.permissions.MY_BROADCAST">
    <intent-filter>
        <!--自定义广播android:name为defineTestBroadcast-->
        <action android:name="defineTestBroadcast" />  
    </intent-filter>
</receiver>

动态注册权限设置

//通过设置registerReceiver()方法的第三个权限配置参数控制

registerReceiver(testBReceiver,iFilter,"com.permissions.MY_BROADCAST",null);

6.有序广播和无序广播

上诉讲解的广播注册和发送都是无序广播,其实有序广播和无序广播的注册和发送步骤都是差不多的;不同处在于:

注册阶段:有序广播在注册的时候需要添加Priority属性,按照Priority属性值的从大小排序,若Priority属性相同者,动态注册的广播优先;

发送阶段:有序广播在发送的时候不是通过sendBroadcast()方法进行发送的,而是通过sendOrderedBroadcast(intent)方法发送的;

 

 

 

  • 2
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值