2015-01-20 15:23 1294人阅读 评论(3) 收藏 举报
 分类:
android开发 / jni(124) 

版权声明:本文为博主原创文章,未经博主允许不得转载。

实现一个功能,可以有很多种方法,但我们所追求的是最适合于自己项目的那一种方法。

就比如app要判断网络状态,如果在每次使用网络的时候去判断一次网络状态的话,有些耗费时间。例如,你要在打开网页之前先判断网络是否畅通以及在下载图片之前判断网络类型,那么务必造成等待时间的增加。因此,我们可以尝试只需在手机网络状态变更的时候,去记录一下当前的网络状态到我们的app里,在使用网络的地方就无需再去主动检查网络了。

废话不多说,本文主要是借助于Android的广播机制BroadcastReceiver来接收系统在网络状态发生改变的时候发出的广播ConnectivityManager.CONNECTIVITY_ACTION即可。

首先、写一个BroadcastReceiver类:

  1. import android.content.BroadcastReceiver;
  2. import android.content.Context;
  3. import android.content.Intent;
  4. import android.net.ConnectivityManager;
  5. import android.util.Log;
  6. import android.widget.Toast;
  7. public class MyReceiver extends BroadcastReceiver {
  8. @Override
  9. public void onReceive(Context context, Intent intent) {
  10. String action = intent.getAction();
  11. if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
  12. Toast.makeText(context, "myareceiver network changed", Toast.LENGTH_LONG).show();
  13. //开启线程刷新网络状态,并保存到Methods类中的networkType属性中
  14. new Thread(new Runnable() {
  15. @Override
  16. public void run() {
  17. //其中Methods为final类,参数netWorkType为当前应用中网络类型的标志
  18. //此处需要根据项目自己做修改
  19. Methods.netWorkType = getAPNType(context);
  20. }
  21. }).start();
  22. }
  23. }
  24. /**
  25. * 获取当前的网络状态 :没有网络0:WIFI网络1:3G网络2:2G网络3
  26. *
  27. * @param context
  28. * @return
  29. */
  30. private static int getAPNType(Context context) {
  31. int netType = 0;
  32. ConnectivityManager connMgr = (ConnectivityManager) context
  33. .getSystemService(Context.CONNECTIVITY_SERVICE);
  34. NetworkInfo networkInfo = connMgr.getActiveNetworkInfo();
  35. if (networkInfo == null) {
  36. return netType;
  37. }
  38. int nType = networkInfo.getType();
  39. if (nType == ConnectivityManager.TYPE_WIFI) {
  40. netType = 1;// wifi
  41. } else if (nType == ConnectivityManager.TYPE_MOBILE) {
  42. int nSubType = networkInfo.getSubtype();
  43. TelephonyManager mTelephony = (TelephonyManager) context
  44. .getSystemService(Context.TELEPHONY_SERVICE);
  45. if (nSubType == TelephonyManager.NETWORK_TYPE_UMTS
  46. && !mTelephony.isNetworkRoaming()) {
  47. netType = 2;// 3G
  48. } else {
  49. netType = 3;// 2G
  50. }
  51. }
  52. return netType;
  53. }
  54. }

其次,在app启动的activity中或AndroidManifest.xml中注册上述的广播接收者即可。

方式一:在activity中注册广播接收者的代码如下:

  1. IntentFilter mFilter = new IntentFilter();
  2. mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
  3. MyReceiver mReceiver = new MyReceiver();
  4. registerReceiver(mReceiver, mFilter);

方式二:通过配置文件来进行静态注册:

  1. <receiver
  2. android:name="com.xxx.MyReceiver"
  3. android:label="NetworkConnection" >
  4. <intent-filter>
  5. <action android:name="android.net.conn.CONNECTIVITY_CHANGE" />
  6. </intent-filter>
  7. </receiver>

至此,一个完整的网络监听功能写完啦。

用BroadcastReceiver监听手机网络状态变化的更多相关文章

  1. Android监听手机网络变化

    Android监听手机网络变化 手机网络状态发生变化会发送广播,利用广播接收者,监听手机网络变化 效果图 注册广播接收者 <?xml version="1.0" encodi ...

  2. iOS 使用AFNetWorking监听APP网络状态变化(可用于更改缓存策略、提示网络等)

    前言 我们知道在APP开发过程中.监听手机当前的网络状态还是一个非经常常使用的方法,这里我来为大家接受一种使用AFNetWorking来监听当前的网络状态的方法:网络监听对程序开发的帮助有非常多:比方 ...

  3. 使用cordova network-information 插件监听手机网络状态

    在使用html5配合cordova做webapp时,有时需要实时监测手机的网络 状况.html5里面是没有相关的js的,这时就需要在cordova里找相关插件了. 一.插件查找 1.在cordova中 ...

  4. 广播小案例-监听系统网络状态 --Android开发

    本例通过广播实现简单的监听系统网络状态改变的小案例. 1.案例效果演示 当手机连网后,系统提示“已连接网络”, 当手机断网后,系统提示“当前网络不可用”. 2.案例实现 在主活动中动态注册广播,然后写 ...

  5. Android监听WIFI网络的变化并且获得当前信号强度

    MainActivity如下: package cc.testwifi; import android.os.Bundle; import android.app.Activity; /** * De ...

  6. Android初级教程使用服务注册广播接收者监听手机解锁屏变化

    之前第七章广播与服务理论篇写到: 特殊的广播接收者(一般发广播次数频率很高) 安卓中有一些广播接收者,必须使用代码注册,清单文件注册是无效的 屏幕锁屏和解锁 电量改变 今天在这里就回顾一下,且用代码方 ...

  7. Android 监听 Android中监听系统网络连接打开或者关闭的实现代码

    本篇文章对Android中监听系统网络连接打开或者关闭的实现用实例进行了介绍.需要的朋友参考下 很简单,所以直接看代码 复制代码 代码如下: package xxx; import android.c ...

  8. Android之——监听手机开机事件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作.在Andr ...

  9. BroadcastReceiver监听电量变化

    用BroadcastReceiver监听电量的变化,可以实现BroadcastReceiver接收电量变化的广播,然后获取电量百分比信息. BatteryChangedReceiver.java pu ...

随机推荐

  1. 文件的inode号操作

    linux给每个文件生成了一个唯一的inode编号,命令行下操作文件需要输入文件名,如果遇到文件名特别难输入(或者包含特殊符号)的情况,可以用inode号操作文件. 可以用这个命令查看inode号: ...

  2. 翻译一篇关于jedis的文章

    翻译 自 http://www.baeldung.com/jedis-java-redis-client-libraryIntro to Jedis – the Java Redis Client L ...

  3. kettle的HTTPPOST控件发送WSDL的webservice请求配置

    1.webservice请求的URL:http://pubservice.rjhn.com.cn/AppserviceTest/JsonWcfService.svc?WSDL 2.使用SOAPUI测试 ...

  4. JQuery中关于浏览器兼容性的问题

      前  言 LIUWE JQuery是一个特别强大的javascript代码库,,它的操作DOM的能力是相当强大的,JQuery可以说是支持各大主流浏览器,但是随着时代的不断发展,浏览器是在不断的更 ...

  5. PuTsangTo-单撸游戏开发02 测试场景与单轴移动

    且不说立项与设计阶段的工作量,一个完整的游戏在开发阶段设计的职责范围也是很广,还有个大问题就是PuTsangTo项目也是本人在边学边做,截止目前还是满满的无从下手的感觉,一方面是技能与经验不足,另一方 ...

  6. Opengl4.5 中文手册—G

    索引 A      B    C      D     E     F     G H      I     J      K     L     M     N O      P    Q      ...

  7. GitHub使用(一) - 新建个人网站

    1.首先进入“仓库Repositories”,点击“新建New”.

  8. [Java语言] 《struts2和spring MVC》的区别_动力节点

    1.Struts2是类级别的拦截, 一个类对应一个request上下文,SpringMVC是方法级别的拦截,一个方法对应一个request上下文,而方法同时又跟一个url对应,所以说从架构本身上Spr ...

  9. 【专章】dp入门

    动态规划(简称dp),可以说是各种程序设计中遇到的第一个坎吧,这篇博文是我对dp的一点点理解,希望可以帮助更多人dp入门. ***实践是检验真理的唯一标准,看再多文章不如自己动手做几道!!!*** 先 ...

  10. [js高手之路] javascript面向对象写法与应用

    一.什么是对象? 对象是n个属性和方法组成的集合,如js内置的document, Date, Regexp, Math等等 document就是有很多的属性和方法, 如:getElementById, ...