android四大组件之Broadcast

为什么需要广播机制呢?

在Android系统中,为什么需要广播机制呢?广播机制,本质上它就是一种组件间的通信方式,如果是两个组件位于不同的进程当中,那么可以用Binder机制来实现,如果两个组件是在同一个进程中,那么它们之间可以用来通信的方式就更多了,这样看来,广播机制似乎是多余的。然而, 广播机制却是不可替代的,它和Binder机制不一样的地方在于,广播的发送者和接收者事先是不需要知道对方的存在的,这样带来的好处便是,系统的各个组件可以松耦合地组织在一起,这样系统就具有高度的可扩展性,容易与其它系统进行集成。
在软件工程中,是非常强调模块之间的 高内聚低耦合性的,不然的话,随着系统越来越庞大,就会面临着越来越难维护的风险,最后导致整个项目的失败。Android应用程序的组织方式,可以说是把这种高内聚低耦合性的思想贯彻得非常透彻,在任何一个Activity中,都可以使用一个简单的Intent,通过startActivity或者startService,就可以把另外一个Activity或者Service启动起来为它服务,而且它根本上不依赖这个Activity或者Service的实现,只需要知道它的字符串形式的名字即可,而广播机制更绝,它连接收者的名字都不需要知道。

广播分类

按照注册方式分:

静态广播和动态广播

静态广播

1、配置文件中配置BroadcastReceiver

<receiver android:name="com.hy.base.androidbase.component.broadcast.receiver.SortBroadcastReceiverA">
    <intent-filter android:priority="999">
        <action android:name="com.broadcast.disorder.staticregisterbroadcast"/>
    </intent-filter>
</receiver>

2、定义BroadcastReceiver

public class SortBroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("060_Demo:","广播接收者1");
    }
}

3、发送对应的广播

Intent broadcast = new Intent("com.broadcast.disorder.staticregisterbroadcast");
sendBroadcast(broadcast,null);

动态广播

1、定义动态广播的BroadcastReceiver

public class ReceiverBR extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("060",intent.getAction()+"动态广播接收者");
    }
}
2、动态注册广播
3、发送动态广播

4、注销动态广播

public class DynamicRegisterBroadcastActivity extends Activity {

    public static final String NEW_LIFEFORM_DETECTED = "com.broadcast.set6666.dynamicbroadcast";
    protected ReceiverBR receiver;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_dynamicregbr);
        Button btn0 = (Button) findViewById(R.id.btn0);
        btn0.setOnClickListener(new View.OnClickListener() {
            public void onClick(View v) {
                //3、发送广播
                Intent it = new Intent(NEW_LIFEFORM_DETECTED);
                sendBroadcast(it);
            }
        });
    }

    @Override
    protected void onResume() {
        super.onResume();
        //2、注册广播
        IntentFilter counterActionFilter = new IntentFilter(NEW_LIFEFORM_DETECTED);
        receiver = new ReceiverBR();
        registerReceiver(receiver, counterActionFilter);
    }

    @Override
    protected void onPause() {
        super.onPause();
        //4、注销广播,否则内存泄漏
        unregisterReceiver(receiver);
    }
}
注意:一定要在Activity退出时注销广播,否则会导致内存泄漏。因为动态广播是依赖于Activity的生命周期的。

按照发送方式分:

有序广播和无序广播

有序广播

1、在配置文件里生命BroadcastReceiver,并声明优先级

<!--android:priority属性值,值越大优先级越高-->
<receiver android:name="com.hy.base.androidbase.component.broadcast.receiver.SortBroadcastReceiver1">
    <intent-filter android:priority="999">
        <action android:name="com.broadcast.order.staticregisterbroadcast"/>
    </intent-filter>
</receiver>

<receiver android:name="com.hy.base.androidbase.component.broadcast.receiver.SortBroadcastReceiver2">
    <intent-filter android:priority="1000">
        <action android:name="com.broadcast.order.staticregisterbroadcast"/>
    </intent-filter>
</receiver>
2、定义BroadcastReceiver
public class SortBroadcastReceiver1 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("060_Demo:","广播接收者1");
    }
}
public class SortBroadcastReceiver2 extends BroadcastReceiver {
    @Override
    public void onReceive(Context context, Intent intent) {
        Log.e("060_Demo:","广播接收者2");
    }
}
3、发送有序广播

//使用静态的方式注册广播,有序广播(两个receiverbtn3.setOnClickListener(new View.OnClickListener(){
    @Override
    public void onClick(View v) {
        Intent broadcast = new Intent("com.broadcast.order.staticregisterbroadcast");
        sendOrderedBroadcast(broadcast,null);
    }
});

无序广播

猜你喜欢

转载自blog.csdn.net/haobobo710/article/details/80914587