为什么需要广播机制呢?
在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、发送有序广播
//使用静态的方式注册广播,有序广播(两个receiver)
btn3.setOnClickListener(new View.OnClickListener(){
@Override
public void onClick(View v) {
Intent broadcast = new Intent("com.broadcast.order.staticregisterbroadcast");
sendOrderedBroadcast(broadcast,null);
}
});
无序广播