Android广播机制是Android操作系统中的一种重要组件,它通过一种发布/订阅模式,实现了应用程序和系统之间的消息传递。通过广播机制,应用程序可以向系统中或其他应用程序中发送消息,也可以接收来自系统或其他应用程序发送的消息。
一、广播类型
Android广播机制中,主要分为三种类型:标准广播(Normal Broadcast)、有序广播(Ordered Broadcast)和粘性广播(Sticky Broadcast)。
1.标准广播
标准广播是一种完全异步执行的广播类型,发送广播后,所有接收器几乎同时接收到广播,接收器之间没有任何的优先级,也不能拦截广播。
//发送标准广播 Intent intent = new Intent("com.example.broadcast.normal"); sendBroadcast(intent); //接收标准广播 public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条标准广播", Toast.LENGTH_SHORT).show(); } }
2.有序广播
有序广播是一种按优先级排序的广播类型,接收器可以通过优先级来拦截广播或者将广播继续向下传递,广播最终会按照优先级依次传递给各个接收器。
//发送有序广播 Intent intent = new Intent("com.example.broadcast.order"); sendOrderedBroadcast(intent, null); //接收有序广播 public class OrderReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条有序广播(1)", Toast.LENGTH_SHORT).show(); //拦截广播 abortBroadcast(); } } public class OrderReceiver2 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条有序广播(2)", Toast.LENGTH_SHORT).show(); } }
3.粘性广播
粘性广播是一种具有粘性的广播类型,发送广播后,如果没有接收器接收到广播,则系统会缓存广播,等到有接收器注册时再发送广播。
//发送粘性广播 Intent intent = new Intent("com.example.broadcast.sticky"); sendStickyBroadcast(intent); //接收粘性广播 public class StickyReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条粘性广播", Toast.LENGTH_SHORT).show(); } }
二、广播发送
1.发送标准广播
发送标准广播,使用Context的sendBroadcast(Intent intent)方法。
Intent intent = new Intent("com.example.broadcast.normal"); sendBroadcast(intent);
2.发送有序广播
发送有序广播,使用Context的sendOrderedBroadcast(Intent intent, String receiverPermission)方法。
Intent intent = new Intent("com.example.broadcast.order"); sendOrderedBroadcast(intent, null);
3.发送粘性广播
发送粘性广播,使用Context的sendStickyBroadcast(Intent intent)方法。
Intent intent = new Intent("com.example.broadcast.sticky"); sendStickyBroadcast(intent);
三、广播接收
1.动态注册广播接收器
动态注册广播接收器,需要创建一个继承BroadcastReceiver的子类,并在onReceive()方法中处理接收到的广播。
public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条标准广播", Toast.LENGTH_SHORT).show(); } } //动态注册广播接收器 NormalReceiver receiver = new NormalReceiver(); IntentFilter filter = new IntentFilter("com.example.broadcast.normal"); registerReceiver(receiver, filter);
2.静态注册广播接收器
静态注册广播接收器,需要在AndroidManifest.xml中声明接收器,并设置intent-filter和action。
//接收标准广播 public class NormalReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条标准广播", Toast.LENGTH_SHORT).show(); } }
四、广播拦截
有序广播可以通过拦截广播来实现优先级的调整,通过BroadcastReceiver的abortBroadcast()方法可以拦截之前的广播,使广播不再向下传递,只有当广播完全执行完毕后,下一个广播接收器才会接收到广播。
public class OrderReceiver1 extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "接收到一条有序广播(1)", Toast.LENGTH_SHORT).show(); //拦截广播 abortBroadcast(); } }
五、广播注销
动态注册的广播接收器,需要在不使用时注销,否则会导致内存泄漏。
//注销广播接收器 unregisterReceiver(receiver);
六、总结
通过Android广播机制,我们可以实现应用程序和系统之间的消息传递,提高应用程序之间的协作效率。在实际开发中,需要根据实际需要选择不同类型的广播,并合理处理广播发送和接收相关操作。