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