美文网首页
Broadcast广播

Broadcast广播

作者: A_Coder | 来源:发表于2016-10-26 01:09 被阅读0次

    Broadcast是一种广泛运用的、在应用程序之间传输信息的机制,一个广播可以有任意个接收者。广播机制是一个典型的发布-订阅模式,也就是观察者模式。广播最大的特点是发送方并不关心接收方是否接到数据,也不关心接收方是如何处理数据的,通过这样的形式来达到接、收双方的完全解耦。
    Android广播机制包含3个基本要素,分别是用于发送广播的Broadcast、接收广播的BroadcastReceiver以及用于传递信息的Intent。

    首先我们需要定义一个广播接收器:

    public class HelloBroadcastReceiver extends BroadcastReceiver{
        @Override
        public void onReceive(Context context, Intent intent){
            Toast.makeText(context, "hello", Toast.LENGTH_LONG).show();
        }
    }
    

    注册广播有两种:

    • 静态注册,在AndroidManifest.xml里面注册广播监听,常驻内存,如果程序关闭,有相应事件触发,程序还是会被系统调用,接收广播:
    <receiver android:name=".broadcast.HelloBroadcastReceiver">
    <intent-filter>
          <action android:name="hello">
    </intent-filter>
    </receiver>
    

    里面receiver的android:name是广播接收处理的类,这个类需要继承BroadcastReceiver。然后action的android:name的是接收intent哪些广播。

    • 动态注册,通过代码在java文件中进行注册,非常驻型,即跟随Activity生命周期,所以Activity的OnDestroy()中调用unregisterReceiver(receiver)方法移除它:
    private void registerHelloBroadcast(){
        registerReceiver(new HelloBroadcastReceiver(), new IntentFilter(HELLO_ACTION));
    }
    

    注册之后就可以发送广播了:

    private void sendNormalBroadcast(){
        sendBroadcast(new Intent(HELL_ACTION));
    }
    

    然后就会调用HelloBroadcastReceiver的onReceive函数,在该函数中执行相关代码操作即可。


    有序广播
    有序广播通过Context.sendOrderBroadcast()来发送,所有的广播接收器按照优先级依次执行,广播接收器的优先级通过receiver的intent-filter中的android:priority属性来设置,数值越大优先级越高。当广播接收器收到广播后,可以使用setResult()函数来把结果传给下一个广播接收器接收,然后通过getResult()函数来取得上个广播接收器返回的结果,并可以用abortBroadcast()函数让系统丢弃这个广播,使该广播不再传送到别的广播接收器。
    设置广播的优先级:

    <receiver android:name".broadcast.HelloBroadcastReceiver">
        <intent-filter android:priority="100">
            <action android="hello">
        </intent-filter>
    </receiver>
    ```
    发送有序广播:
    private void sendOrderBroadcast(){
        sendOrderedBroadcast(new Intent(HELLO_ACTION),  null);
    }
    ***
    **本地广播(LocalBroadcastManager)**
    当我们并不需要把自己所有应用内的信息广播给所有应用,而只在进程内使用,使用LocalBroadcastManager就能够实现。
    
    | 函数|   作用  |
    | ------------- |:-----------------:|
    |LocalBroadcastManager.getInstance(context).registerReceiver(receiver,intentFilter) |注册Receiver |
    |LocalBroadcastManager.getInstance(context).unregisterReceiver(receiver)| 注销Receiver |
    | LocalBroadcastManager.getInstance(context).sendBroadcast(new Intent(HELLO_ACTION))  | 发送异步广播|
    | LocalBroadcastManager.getInstance(context).sendBroadcastSync(new Intent()) |发送同步广播|

    相关文章

      网友评论

          本文标题:Broadcast广播

          本文链接:https://www.haomeiwen.com/subject/nkxduttx.html