Android中的广播主要包括两种类型:标准广播和有序广播。

标准广播

标准广播是一种完全异步执行的广播。在广播发出之后,所有广播接收器几乎是在同一时刻收到广播消息,他们之间没有任何先后顺序。这种广播的效率比较高,但同时也意味着这种广播无法被截断。

有序广播

有序广播是一种同步执行的广播,在广播发出去之后,同一时刻只会有一个广播接收器收到这条消息,当这个广播接收器中的逻辑执行完毕后,广播会继续传播。此时的广播接收器是有先后顺序的,优先级高的广播接收器可以先收到广播,而且前面的广播接收器可以截断正在传播的广播。,这样后面的广播接收器将无法收到广播消息。

注:要想使用广播,首先要注册广播,注册广播主要有两种方式:动态注册 和 静态注册

动态注册是在代码中注册广播,静态注册是在AndroidManifest.xml中注册广播。

一、下面通过例子来了解一下基本的动态注册广播的使用。

通过接收系统的广播,动态监听网络状态的变化

//检测网路状态的改变public class MainActivity extends AppCompatActivity {    private IntentFilter intentFilterer;    private NetworkChangeReceiver networkChangeReceiver;    @Override    protected void onCreate(Bundle savedInstanceState) {        super.onCreate(savedInstanceState);        setContentView(R.layout.activity_main);        //创建一个IntentFilter的实例        intentFilterer = new IntentFilter();        //添加action(网络连接活动改变) intentFilterer.addAction("android.net.conn.CONNECTIVITY_CHANGE");        networkChangeReceiver = new NetworkChangeReceiver();        //注册广播        registerReceiver(networkChangeReceiver, intentFilterer);    @Override    protected void onDestroy() {        super.onDestroy();        //动态注册的广播一定要取消注册        unregisterReceiver(networkChangeReceiver);    }    //自定义内部类继承于BroadcastReceiver    class NetworkChangeReceiver extends BroadcastReceiver{        @Override        public void onReceive(Context context, Intent intent) {            //获得一个系统服务类实例            ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);            NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();            //isAvailable()判断当前是否有网络            if (networkInfo != null && networkInfo.isAvailable()){                Toast.makeText(context, "network is available", Toast.LENGTH_SHORT).show();            }else{                Toast.makeText(context, "network is unavailable", Toast.LENGTH_SHORT).show();            }        }    }}

上面的代码中,主要分为以下几个步骤进行:

1 . 创建一个广播接收器的内部类继承自BroadcastReceiver。

2 . 获得IntentFilter()的实例,添加action,这里,当系统网络状态发生变化时,系统发出的就是一条android.net.conn.CONNECTIVITY_CHANGE广播。

3 . 获得广播接收器的实例。

4 . 通过registerReceiver()注册广播,该方法中第一个参数是广播接收器的实例,第二个参数是IntentFilter的实例。同时在onDestroy()方法中加入unregisterReceiver(networkChangeReceiver);取消对广播的注册。动态注册的广播一定要取消注册。

5 . 重写广播接收器内部类中的onReceiver()方法,在广播到来时,就会触发onReceiver()方法,可以在onReceiver()中处理具体的逻辑。此处,首先通过一个getSystemService()方法得到ConnectivityManager的实例,这是一个系统服务类,专门用来管理网路连接的,然后调用它的getActiveNetworkInfo()方法可以得到NetworkInfo的实例,最后用NetworkInfo的isAvailable()方法就可以判断出当前是否有网路了。

6 . 在AndroidManifest文件中加入查看网络状态的权限声明。

现在你就可以在通过改变网络状态来接收到广播了。

二、下面通过例子来了解静态注册广播的用法。

静态注册实现开启启动

1 . 新建一个广播接收器的类,继承自BroadcastReceiver,重写onReceiver()方法。

public class BootCompleteReceiver extends BroadcastReceiver {    @Override    public void onReceive(Context context, Intent intent) {        Toast.makeText(context, "Boot Complete", Toast.LENGTH_SHORT).show();    }}

2 . 在AndroidManifest.xml文件中注册。

<receiver android:name=".receiver.BootCompleteReceiver">            <intent-filter>                <action android:name="android.intent.action.BOOT_COMPLETED"/>            </intent-filter>        </receiver>

这里的receiver标签中的name是自己定义的广播接收器的类文件的路径。这里的action就是android自己发出的广播的名称。

3 . 在AndroidManifest.xml文件中添加开机自启动的权限。

<uses-permission android:name="android.permission.RECEIVE_BOOT_COMPLETED"/>

现在我们在关机后再开机,就会收到一条广播。

通过上面我么发现,动态注册的广播之后在应用打开之后才能接收到广播,而静态注册的广播可以在任何时候都可以接收到广播。

更多相关文章

  1. Android静态注册广播和动态注册广播的区别
  2. 开始今天的学习吧!Android开发Day1
  3. android UDP多点广播,并自动建立Socket连接
  4. Android(安卓)Broadcast receiver 编程
  5. Android(安卓)广播机制---BroadCast
  6. Android(安卓)Sensor分析
  7. Android(安卓)2.2.1系统广播大全
  8. android应用程序监听SMS Intent广播
  9. Android异步任务处理之AsyncTaskLoader的使用

随机推荐

  1. AndroidStudio opencv(一)
  2. android关闭应用程序
  3. Android初级进阶之Shape
  4. android字体更换
  5. Myeclipse出现错误:Errors running builde
  6. Android之ListView的简单用法
  7. Unable to resolve target 'android-i'
  8. AndroidStudio上面最好用的插件
  9. Android(安卓)报错 “程序包R不存在...!”
  10. 【Android】【opencv】实现摄像头拍照和