Android 中的广播主要可以分为两种类型,标准广播和有序广播
标准广播(Normal broadcasts)是一种完全异步执行的广播,在广播发出之后,所有的广播接收器几乎都会在同一时刻接收到这条广播消息,因此它们之间没有任何先后顺序可言。这种广播的效率会比较高,但同时也意味着它是无法被截断的。
有序广播(Ordered broadcasts)则是一种同步执行的广播,在广播发出之后,同一时刻只会有一个广播接收器能够收到这条广播消息,当这个广播接收器中的逻辑执行完毕后,广播才会继续传递。所以此时的广播接收器是有先后顺序的,优先级高的广播接收器就可以先收到广播消息,并且前面的广播接收器还可以截断正在传递的广播,这样后面的广播接收器就无法收到广播消息了。
接受系统广播有两种方式
动态注册(在代码中注册,以检测网络状态为例)
代码示例:
public class MainActivity extends AppCompatActivity { //设定广播的过滤信息 IntentFilter intentFilter; //定义网络广播接收器 NetworkChangeReceiver receiver; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); //设置过滤 intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); receiver = new NetworkChangeReceiver(); //注册广播接收器 registerReceiver(receiver,intentFilter); } //在onDestroy方法中注销广播接收器 @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(receiver); } class NetworkChangeReceiver extends BroadcastReceiver{ //当接收到网络变动时,自动执行该方法 @Override public void onReceive(Context context, Intent intent) { //获取网络状态 ConnectivityManager connectivityManager = (ConnectivityManager)getSystemService(context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectivityManager.getActiveNetworkInfo(); if(networkInfo!=null&&networkInfo.isAvailable()){ Toast.makeText(context, "网络可用", Toast.LENGTH_SHORT).show(); } else{ Toast.makeText(context, "网络不可用", Toast.LENGTH_SHORT).show(); } } } }
静态注册(在AndroidManifest.xml中注册,以实现开机启动为例)
动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播(这必然是在系统启动之后),因为注册的逻辑是写在onCreate()方法中的,而静态注册则可以在开机时启动。
静态注册实现开机启动程序原理:接收开机时的广播,收到即启动程序
新建SystemLaunchReceiver类
public class SystemLaunchReceiver extends BroadcastReceiver{ @Override public void onReceive(Context context, Intent intent) { Toast.makeText(context, "在这里添加系统启动时你想要做的事", Toast.LENGTH_LONG).show(); } }
<receiver android:name=".SystemLaunchReceiver" > <intent-filter> <action android:name="android.intent.action.BOOT_COMPLETED" /> </intent-filter> </receiver>
<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED" />
PS:不要在onReceive()方法中添加过多的逻辑或者进行任何的耗时操作,因为在广播接收器中是不允许开启线程的, 当 onReceive()方法运行了较长时间而没有结束时, 程序就会报错。因此广播接收器更多的是扮演一种打开程序其他组件的角色,比如创建一条状态栏通知,或者启动一个服务等。
PS:
关于IntentFilter:
当Intent在组件间传递时,组件如果想告知Android系统自己能够响应和处理哪些Intent,那么就需要用到IntentFilter对象。 顾名思义,IntentFilter对象负责过滤掉组件无法响应和处理的Intent,只将自己关心的Intent接收进来进行处理。 IntentFilter实行“白名单”管理,即只列出组件乐意接受的Intent,但IntentFilter只会过滤隐式Intent,显式的Intent会直接传送到目标组件。 Android组件可以有一个或多个IntentFilter,每个IntentFilter之间相互独立,只需要其中一个验证通过则可。除了用于过滤广播的IntentFilter可以在代码中创建外,其他的IntentFilter必须在AndroidManifest.xml文件中进行声明。(在广播中我们用到了IntentFilter)
关于文中用到的ConnectivityManager可参考:http://blog.csdn.net/oyangyujun/article/details/41723865
以上就是Android广播的接收机制了,有时间我再补上广播的发送方法以及其他和广播有关的内容