广播接收器的使用(1)
2016-03-09 21:32
302 查看
参考自郭霖的书
注册广播的方式一般有两种,在代
码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册。
那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。
因为当网络状态发生变化时,系统发出的正是一条android.net.conn.CONNECTIVITY_CHANGE 的广播,也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action 就行了。接下来创建了一个NetworkChangeReceiver 的实例,然后调用registerReceiver()方法进行注册,将NetworkChangeReceiver 的实例和IntentFilter 的实例都传了进去,这样NetworkChangeReceiver 就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE 的广
播,也就实现了监听网络变化的功能。`
另外,这里有非常重要的一点需要说明,Android 系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则程序将会直接崩溃, 比如这里查询系统的网络状态就是需要声明权限的。打开AndroidManifest.xml 文件,在里面加入如下权限就可以查询系统网络状态了
终于,标签内出现了一个新的标,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和标签非常相似,首先通过android:name来指定具体注册哪一个广播接收器,然后在标签里加入想要接收的广播就行了,由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广播,因此我们在这里添加了相应的action。另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限。
注册广播的方式一般有两种,在代
码中注册和在AndroidManifest.xml 中注册,其中前者也被称为动态注册,后者也被称为静态注册。
那么该如何创建一个广播接收器呢?其实只需要新建一个类,让它继承自BroadcastReceiver,并重写父类的onReceive()方法就行了。这样当有广播到来时,onReceive()方法就会得到执行,具体的逻辑就可以在这个方法中处理。
因为当网络状态发生变化时,系统发出的正是一条android.net.conn.CONNECTIVITY_CHANGE 的广播,也就是说我们的广播接收器想要监听什么广播,就在这里添加相应的action 就行了。接下来创建了一个NetworkChangeReceiver 的实例,然后调用registerReceiver()方法进行注册,将NetworkChangeReceiver 的实例和IntentFilter 的实例都传了进去,这样NetworkChangeReceiver 就会收到所有值为android.net.conn.CONNECTIVITY_CHANGE 的广
播,也就实现了监听网络变化的功能。`
public class MainActivity extends Activity { …… @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); intentFilter = new IntentFilter(); intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE"); networkChangeReceiver = new NetworkChangeReceiver(); registerReceiver(networkChangeReceiver, intentFilter); } @Override protected void onDestroy() { super.onDestroy(); unregisterReceiver(networkChangeReceiver); } class NetworkChangeReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { ConnectivityManager connectionManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo(); 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(); } } } }
另外,这里有非常重要的一点需要说明,Android 系统为了保证应用程序的安全性做了规定,如果程序需要访问一些系统的关键性信息,必须在配置文件中声明权限才可以,否则程序将会直接崩溃, 比如这里查询系统的网络状态就是需要声明权限的。打开AndroidManifest.xml 文件,在里面加入如下权限就可以查询系统网络状态了
静态注册实现开机启动
动态注册的广播接收器可以自由地控制注册与注销,在灵活性方面有很大的优势,但是它也存在着一个缺点,即必须要在程序启动之后才能接收到广播,因为注册的逻辑是写在onCreate()方法中的。那么有没有什么办法可以让程序在未启动的情况下就能接收到广播呢?这就需要使用静态注册的方式了。这里我们准备让程序接收一条开机广播,当收到这条广播时就可以在onReceive()方法里执行相应的逻辑,从而实现开机启动的功能。终于,标签内出现了一个新的标,所有静态注册的广播接收器都是在这里进行注册的。它的用法其实和标签非常相似,首先通过android:name来指定具体注册哪一个广播接收器,然后在标签里加入想要接收的广播就行了,由于Android 系统启动完成后会发出一条值为android.intent.action.BOOT_COMPLETED 的广播,因此我们在这里添加了相应的action。另外,监听系统开机广播也是需要声明权限的,可以看到,我们使用标签又加入了一条android.permission.RECEIVE_BOOT_COMPLETED 权限。
相关文章推荐
- online_judge_1519
- leetcode:Add Two Numbers 【Java】
- linux基础命令
- 3.08课·········switch case及if else嵌套(日期格式)
- 搜索专题备忘录2
- [国嵌攻略][125][总线设备驱动模型]
- 第四天 网络 post get JSONObject
- 继承和Protected修饰符(C#)
- IT小小鸟的读后感
- js的抽象方法
- 蓝桥杯_算法训练_节点选择(用Dijkstra,Bellman-Ford,SPFA算法分别实现)
- 高性能网站架构设计之缓存篇(3)- Redis 主从复制
- 如何在Windows 2012 Server上开启多用户远程?
- 【PAT】1047. 编程团体赛(20)
- HDU 2502月之数(递推呀。。。)
- session 和 cookie区别
- 循环结构
- 学习笔记-动态树Link-Cut-Tree
- Java程序员应该具备的知识点
- 礼拜三log~java web框架探索&baidu地图