Android中的广播机制(一)----- 接收广播
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"/>
现在我们在关机后再开机,就会收到一条广播。
通过上面我么发现,动态注册的广播之后在应用打开之后才能接收到广播,而静态注册的广播可以在任何时候都可以接收到广播。
更多相关文章
- Android静态注册广播和动态注册广播的区别
- 开始今天的学习吧!Android开发Day1
- android UDP多点广播,并自动建立Socket连接
- Android(安卓)Broadcast receiver 编程
- Android(安卓)广播机制---BroadCast
- Android(安卓)Sensor分析
- Android(安卓)2.2.1系统广播大全
- android应用程序监听SMS Intent广播
- Android异步任务处理之AsyncTaskLoader的使用