`

使用Service和BroadcastReceiver实时监听网络状态

阅读更多
很多时候我们都需要实时监听网络状态,当网络状态发生变化后通知程序实行不同的策略。
这里,我采用Service+BroadcastReceiver的形式实时监听网络变化。
原理是程序在背后启一个Service,在Service中注册一个广播,当网络变化时会产生一个ConnectivityManager.CONNECTIVITY_ACTION事件,只要监听这个事件就可以了。代码如下:
import android.app.Service;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.os.IBinder;
import android.util.Log;

public class NetworkStateService extends Service{

	private static final String tag="tag";
	private ConnectivityManager connectivityManager;
    private NetworkInfo info;

    private BroadcastReceiver mReceiver = new BroadcastReceiver() {

        @Override
        public void onReceive(Context context, Intent intent) {
            String action = intent.getAction();
            if (action.equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
                Log.d(tag, "网络状态已经改变");
                connectivityManager = (ConnectivityManager)getSystemService(Context.CONNECTIVITY_SERVICE);
                info = connectivityManager.getActiveNetworkInfo();  
                if(info != null && info.isAvailable()) {
                    String name = info.getTypeName();
                    Log.d(tag, "当前网络名称:" + name);
                    //doSomething()
                } else {
                    Log.d(tag, "没有可用网络");
                  //doSomething()
                }
            }
        }
    };
    
	@Override
	public IBinder onBind(Intent intent) {
		// TODO Auto-generated method stub
		return null;
	}

	@Override
	public void onCreate() {
		super.onCreate();
		IntentFilter mFilter = new IntentFilter();
		mFilter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
		registerReceiver(mReceiver, mFilter);
	}

	@Override
	public void onDestroy() {
		super.onDestroy();
		unregisterReceiver(mReceiver);
	}

	@Override
	public int onStartCommand(Intent intent, int flags, int startId) {
		return super.onStartCommand(intent, flags, startId);
	}
	
}


别忘了在Manifast中配置这个Service:
<service android:enabled="true" android:name="com.reyo.util.NetworkStateService" />

还有权限:
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

在必要的地方启动该Service即可:
Intent i=new Intent(context,NetworkStateService.class);
startService(i);


另外附加几个Android网络连接的判断
1)判断是否有网络连接
public boolean isNetworkConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
         if (mNetworkInfo != null) {  
             return mNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

2)判断WIFI网络是否可用
public boolean isWifiConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mWiFiNetworkInfo = mConnectivityManager  
                 .getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
         if (mWiFiNetworkInfo != null) {  
             return mWiFiNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

3)判断MOBILE网络是否可用
public boolean isMobileConnected(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mMobileNetworkInfo = mConnectivityManager  
                 .getNetworkInfo(ConnectivityManager.TYPE_MOBILE);  
         if (mMobileNetworkInfo != null) {  
             return mMobileNetworkInfo.isAvailable();  
         }  
     }  
     return false;  
 }

4)获取当前网络连接的类型信息
public static int getConnectedType(Context context) {  
     if (context != null) {  
         ConnectivityManager mConnectivityManager = (ConnectivityManager) context  
                 .getSystemService(Context.CONNECTIVITY_SERVICE);  
         NetworkInfo mNetworkInfo = mConnectivityManager.getActiveNetworkInfo();  
         if (mNetworkInfo != null && mNetworkInfo.isAvailable()) {  
             return mNetworkInfo.getType();  
         }  
     }  
     return -1;  
 }
分享到:
评论

相关推荐

    时时监听网络状态/判断网络连接情况

    1、用service和broadcastReceiver来时时监听网络状态。 2、判断网络连接状态的方法(如mobile网络和wifi网络) 3、用广播WifiManager.NETWORK_STATE_CHANGED_ACTION和ConnectivityManager.CONNECTIVITY_ACTION都行,...

    安卓广播监听按键事件和屏幕熄屏亮屏监听

    安卓广播监听按键事件和屏幕熄屏亮屏监听,BroadcastReceiver使用

    疯狂Android讲义源码

     2.7.2 使用监听器来监听菜单事件 136  2.7.3 创建复选菜单项和单选菜单项 137  2.7.4 设置与菜单项关联的Activity 140  2.7.5 上下文菜单 141  2.8 本章小结 143  第3章 事件处理 144  3.1 Android的事件...

    疯狂Android讲义.part2

    13.5 使用Web Service进行网络 编程 508 13.5.1 Web Service简介 509 13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理...

    疯狂Android讲义.part1

    13.5 使用Web Service进行网络 编程 508 13.5.1 Web Service简介 509 13.5.2 Web Service平台概述 510 13.5.3 使用Android应用调用 Web Service 512 13.6 本章小结 524 第14章 管理Android手机桌面 525 14.1 管理...

    android 4 (实测4.3和4.4可以用) 响铃5秒后自动接电话

    开发工具为eclipse,一个BroadcastReceiver监听电话状态,响铃则启动接电话的Service。

    Android监听来电和去电的实现方法

    本文实例讲述了Android监听来电和去电的实现方法。分享给大家供大家参考,具体如下: 要监听android打电话和接电话,只需下面2步骤 第一步,写一个Receiver继承自BroadcastReceiver import android.app.Service; ...

    Android编程监听APK安装与删除等过程的方法

    软件下载后的一系列动作监听:先前是通过Service监听扫描获取状态,以后用这个方法测试使用 import android.content.BroadcastReceiver; import android.content.Context; import android.content.Intent; import ...

    Android 简单播放歌曲功能演示.rar

    Android 简单播放歌曲功能演示,播放本地音乐,非网络播放,可播放、暂停,运行效果如截图所示,在编写时,要注意以下代码:  int status = 1;//当前的状态,1没有声音播放 ,2 正在播放声音,3暂停  ImageButton ...

    Android开发艺术探索.任玉刚(带详细书签).pdf

    本书是一本Android进阶类书籍,采用理论、源码和实践相结合的方式来阐述高水准的Android应用开发要点。本书从三个方面来组织内容。第一,介绍Android开发者不容易掌握的一些知识点;第二,结合Android源代码和应用层...

    OPhone应用开发权威指南(黄晓庆)

    9.3.2 GET方法的使用和限制 378 9.3.3 使用POST方法上传附件 382 9.3.4 从服务器端下载图片 390 9.4 设计C/S通信数据格式 392 9.4.1 对象序列化 396 9.4.2 使用XML传输对象 401 9.5 小结 409 第10章 高级通信技术 ...

    Android开发艺术探索

     13.4.1 使用dex2jar和jd-gui反编译apk / 470  13.4.2 使用apktool对apk进行二次打包 / 470  第14章 JNI和NDK编程 / 473  14.1 JNI的开发流程 / 474  14.2 NDK的开发流程 / 478  14.3 JNI的数据类型和类型签名...

    Android自主学习项目报告(一).doc

    BroadcastReceiver监听系统广播、其它应用程序广播、 其它组件广播,并响应广播消息;ContentProvider用于进程间共享数据。 线性布局---LinearLayout 表格布局---TableLayout 相对布局---RelativeLayout 帧布局---...

    Android 开发技巧

    2.3.2、如何使用Service 27 2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动的服务 34 2.4、CONTENT PROVIDER 35 3、ANDROID UI LAYOUT 35 3.1、概述 35 3.2、线性布局(LINEAR LAYOUT) ...

    Android开发资料合集-World版!

    2.3.2、如何使用Service 27 2.3.3、Service的生命周期 32 2.3.4、判断服务开启状态 33 2.3.5、获取启动的服务 34 2.4、CONTENT PROVIDER 35 3、ANDROID UI LAYOUT 35 3.1、概述 35 3.2、线性布局(LINEAR LAYOUT) ...

Global site tag (gtag.js) - Google Analytics