android 广播接收者

时间:2020-12-04 10:10:50
广播--BroadCast
什么是广播?
    电台以特定频率发出的信息,叫做广播。

收音机:
    调整收音机的频率和电台一致,就能收到广播。


案例:
    开机自启的原理:
        系统在手机开机的时候,会以特定频率
发送一个开机的广播,某些app里面设定有特定频率的收音机,
这些收音机能够接收到开机广播,进而开启 Activity或者Service.

    优酷App:
        如果当前是wifi环境,则自动播放视频;
    如果是3g或者4g网络,则不会自动播放视频。

    一旦网络环境发生变化,系统会发送一个特定广播,
优酷App接收到当前广播,就能从广播信息中得到当前网络的情况。




安卓四大组件:
    Activity
    ContentProvider
    Service
    收音机---BroadCastReceiver

BroadCastReceiver分解:
    BroadCast广播
    Receiver 接收者



广播接收者的实现步骤:
    1,自定义 BroadCastReceiver的子类
        重写onReceive()方法

    2,在当前app的清单文件中注册广播接收者。
        一定要设置广播接收者的频率。

    <receiver
             android:name="com.example.app_1.receiver.App_1_MyReceiver_1"
             >
             <intent-filter>
                 <action android:name="com.tz.receiver.myChanel"/>
             </intent-filter>
         </receiver>

    3,模拟电台,发送特定频率的广播。
        Intent intent=new Intent();
        intent.setAction("频率");

        xxx xxx

        sendBroadCast( intent );
        

    4,系统会匹配到特定的收音机,然后回调其onReceive()方法。




广播的分类:
    1,系统广播
        无序广播
        有序广播

    2,普通广播
        无序广播
        有序广播


实现:
    APP_1 发送广播之后,

    我们希望四个收音机接收到广播的顺序如下:
        APP_2_MyReceiver_1    4
        APP_1_MyReceiver_3    3
        APP_1_MyReceiver_2    2
        APP_1_MyReceiver_1    1

1,设置四个收音机的优先级。
    优先级取值范围  -1000 到 1000
    默认是0.



2,模拟电台发送广播的时候,不要采用
    sendBroadCast(Intent  intent)
   而是
    sendOrederedBroadCast(Intent intent);


有序广播的特点:
    1,优先级高的收音机在接收到广播之后,
    可以终止广播向优先级低的收音机传播

    onReceive(){

        abortBroadCast();
    }

    2.更改数据。

        注意:不是更改intent里面的数据。

    



问题1:
    APP_1,可以发送广播,如果不做任何操作,
我们已经证明 APP_1三个收音机和 APP_2里面的一个收音机
都能接收到广播。

    但是,我们此时希望APP_1发送的广播,
只能是APP_1里面的三个收音机接收到广播。



    解决方案1:
        增加权限给APP_1,APP_2因为没有权限,
即时频率匹配广播,因为没有权限也是接收不到的。


    
    解决方案2:
        电台在发送广播的时候,
    可以明确规定广播的传递范围。

    
    //通过intent,可以设置当前广播的传递范围。
    intent.setPackage(getPackageName());




问题2:
    APP_2这里面有个一个收音机,这个收音机主要处理的是
当前APP_2发送的广播。  我们不希望APP_2里面的收音机接收到
其他App发过来的广播。


        android:exported="true"表示可以接收外部app发过来的广播

        反之,不接收外部app发过来的广播。


整理自教程