安卓四大组件之广播

基本介绍

 broadcast是一种广泛运用在应用程序之间传输信息的机制,android中的broadcast很像我们平时的广播,一个广播可以有多个收听者,每个收听到广播的人都可以依据广播做不同的行为,使用了观察者设计模式,

安卓的广播包括三要素,发送广播的broadcast,接收广播的broadcastReceiver,以及用于传递信息的Intent。

观察者设计模式

广播实际上就是运用 观察者模式最好的例子,很多地方都会使用了观察者模式,那么什么事观察者模式呢?以下是百度给的答案

观察者模式完美的将观察者和被观察者对象分开,举个例子:用户界面可以做为一个观察者,业务数据是被观察者,用户界面观察业务数据的变化,发现变化后,就显示在界面上,面向对象设计的一个原则是:系统中每一个类都将重点放在某一功能上,而不是其他方面,一个对象只做一件事,并且将他做好,观察者模式在模块间划定了界限,提高了应用程序间的可维护性和重用性。

观察者设计模式定义了对象间一种一对多的的组合关系。以便一个对象的状态发生改变时,所有依赖于他的对象都得到通知,并自动刷新。

四种广播

1.普通广播

普通广播是完全异步的,通过Context的SendBroadcast()函数来发送,消息传递的效率比较高,但所有的receivers(接收器)的执行顺序不确定,缺点是:接收者不能将处理结果传递给下一个接收者,并且无法终止广播Intent的传播,直到没有与之匹配的的广播接收器为止。



小demo:

首先继承BroadcastReceiver,然后需要重写onReceiver()方法,这样我们就实现了一个接收器。

我这里是当接收器接收到广播之后就发一条toast,证明他接收到了。

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


}

四大组件都需要在Androidmanifest中进行注册(静态注册)

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter>
        <action android:name="hello"></action>
    </intent-filter>
</receiver>

当然也可以在代码中注册(动态注册)

registerReceiver(new MyBroadcastReceiver(),new IntentFilter("hello"));

如果是动态注册的,别忘了在onDestory()中注销广播

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(new MyBroadcastReceiver());
}

现在我们能给发送一条广播了

sendBroadcast(new Intent("hello"));

当我们发送一条广播是会弹出一条Toast,说明广播接收器接收到了。

2.有序广播

有序广播通过Context.sendOrderdBroadcast()来发送,所有的广播按照优先级顺序依次进行,广播接收器的 优先级通过receiver的intent-filter中的priority属性来设置,数组越大优先级越高(最大为最大数),当广播接收器结收到广播后可以使用setResult()函数来将结果传递给下一个接收器接收,然后通过getResult来获取上 一个接收器的返回的结果,并可以用abortBroadcast()函数来让系统丢弃该广播,该广播不在传递到别的广播接收器接收。


首先我们注册两个广播接收器

public class MyBroadcastReceiver extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        int i=1;
        Toast.makeText(context, i+"", Toast.LENGTH_SHORT).show();
        Bundle bundle=new Bundle();
        bundle.putInt("I",i);
        setResult(1,i+"",bundle);
    }


}
public class MyBroadcastReceiver2 extends BroadcastReceiver{
    @Override
    public void onReceive(Context context, Intent intent) {
        Bundle resultExtras = getResultExtras(true);
        int i = resultExtras.getInt("I");
        Toast.makeText(context, i+1+"", Toast.LENGTH_SHORT).show();
    }
} 

并在androidManifest中注册并设置两个广播接收器的优先级

<receiver android:name=".MyBroadcastReceiver">
    <intent-filter android:priority="10">
        <action android:name="hello"></action>
    </intent-filter>
</receiver>
<receiver android:name=".MyBroadcastReceiver2">
    <intent-filter android:priority="1">
        <action android:name="hello"></action>
    </intent-filter>
</receiver>

然后发送一条有序广播,第二个参数是权限相关的字符串,可以传入null。

sendOrderedBroadcast(new Intent("hello"),null);
这时Toast分别弹出的是1和2,说明我们获取到了上一个广播接收器的结果,当然我们也能通过给优先级较高的接收器设置截断广播
abortBroadcast();

这样,之后的广播接收器都不会再接收到广播了。

3.本地广播

前面的两种广播都是全局广播,这样的广播可以被任意应用程序接收,并且我们也能接收到来自其他应用程序的广播,这样很容易引起安全问题,android为了解决这个问题引入了本地广播。,使用这个机制发送的广播只能在本应用程序内部进行传递,并且广播接收器也只能接收本应用程序的广播,这样所有的安全问题就不存在了。

小demo

首先先获取本地广播实例,并发送一条异步广播

localBroadcastManager=LocalBroadcastManager.getInstance(this);
localBroadcastManager.sendBroadcast(new Intent("hello1"));

然后通过本地广播接收者接收本地广播

localBroadcastManager.registerReceiver(register,new IntentFilter("hello1"));

然后实例化BroadcastReceiver,并发送一条Toast。

private BroadcastReceiver register=new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        Toast.makeText(context, "hello", Toast.LENGTH_SHORT).show();
    }
};

最后在onDestory中注销本地广播接收者,避免oom。

@Override
protected void onDestroy() {
    super.onDestroy();
    unregisterReceiver(register);
}

好了,这样,只要我们点击本地广播发送一条广播,就本地广播接收器就能接收到,并弹一条Toast。

4.sticky广播

sticky广播通过Context。sendStickyBroadcast()函数来发送,用此函数发送的广播会一直滞留,当有与之匹配的 广播接收器接被注册后,该广播接收器就会接收到广播,当然sticky广播需要下面权限。

<uses-permission android:name="android.permission.BROADCAST_STICKY"></uses-permission>
sticky只保留最后一条广播,并且一直保留下去,这样即使有广播接收器处理了该广播,当有再与之匹配的广播接收器接收时,此广播任会被接收,如果你只想处理一次广播,可以通过removeStickyBroadcast()函数实现。

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页