Android 中的每个应用程序都可以对自己感兴趣的广播进行注册,这样该程序就只会接收到自己所关心的广播内容,这些广播可能是来自于系统的,也可能是来自于其他应用程序的。

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();    }}

在AndroidManifest的application中添加注册信息

<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广播的接收机制了,有时间我再补上广播的发送方法以及其他和广播有关的内容

更多相关文章

  1. EditText组件drawableLeft属性设置的图片和hint设置的文字之间的
  2. Android应用程序窗口(Activity)窗口对象(Window)创建指南
  3. broadcast基础
  4. 用Eclipse开发Android应用程序(1): 开始之前
  5. [Wp7] 写给Android开发者的Windows Phone开发秘籍
  6. Android开发工程师面试心得
  7. 将app变为桌面程序,开机后不再显示原桌面,而是显示我们的app界面
  8. Android笔面试
  9. Android开源组件

随机推荐

  1. Android View视图------Android如何创建
  2. mtk android内置nginx服务器的方法
  3. listview滑动变黑的问题
  4. 源码分析Android(安卓)AMS WMS PMS
  5. cordova 图标设置
  6. Android如何获取屏幕的分辨
  7. Android仿微信右上角点击加号弹出PopupWi
  8. Android(安卓)手势检测
  9. Creating an iOS and Android Cocos2D-x
  10. Android网络状态实时监听器