`

使用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;  
 }
分享到:
评论

相关推荐

    BroadcastReceiver监听网络状态(2)

    在Android开发中,`BroadcastReceiver` 是一个至关重要的组件,它允许我们监听并响应系统广播事件,例如设备的网络状态变化。在这个特定的场景中,我们关注的是如何在Fragment中利用`BroadcastReceiver`来监听网络...

    BroadcastReceiver监听网络状态

    在本场景中,"BroadcastReceiver监听网络状态" 的核心目标是利用BroadcastReceiver来实时监控设备的网络连接状况,并根据网络状态的变化更新当前的Activity。这在现代移动应用中非常常见,因为用户期望应用能够无缝...

    BroadcastReceiver与Service的例子

    “拍照设置”通常涉及相机API的使用,但BroadcastReceiver可能用于监听设备连接到相机的事件,Service则可以处理拍照后的图片处理和存储。 总的来说,这个例子涵盖了Android开发中的多个重要知识点,包括...

    android服务自启动Service以及BroadcastReceiver和Notification.zip

    在Android开发中,服务(Service)、广播接收器(BroadcastReceiver)和通知(Notification)是三个核心组件,它们各自承担着不同的职责,同时在特定场景下相互配合,为应用程序提供后台运行、事件监听和用户交互的...

    安卓启动退出网络判断相关-实时监听网络状态.rar

    "安卓启动退出网络判断相关-实时监听网络状态.rar"这个压缩包可能包含了实现这一功能的相关代码示例和资源。下面我们将深入探讨如何在Android应用中实现实时监测网络状态,并对启动退出时的网络判断进行详细解析。 ...

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

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

    Android移动开发检测网络状态并使用BroadcastReceiver(广播接收者)进行接收网络变化的后续处理

    在Android移动应用开发中,了解如何检测网络状态以及利用...通过ConnectivityManager获取网络状态,然后利用BroadcastReceiver监听网络变化,我们可以及时响应网络状态的切换,从而实现相应功能的自动调整。

    Android之Service&BroadCastReceiver

    BroadcastReceiver则适用于监听各种系统或应用事件,如网络状态变化、系统升级等。结合使用,可以实现复杂的后台功能和跨组件通信。 例如,CountService可能是用来实现一个计数服务,它在后台持续计数,并可能通过...

    Android监听网络状态

    8. **网络状态的持续监听**:为了实现长时间监听,可以在Service中注册`BroadcastReceiver`,这样即使应用退到后台,仍然可以接收到网络状态的变化。 9. **数据流量监控**:如果需要统计数据流量的使用,可以通过`...

    Android通过使用广播监听网络状态的改变

    总的来说,Android通过BroadcastReceiver和ConnectivityManager服务,为开发者提供了一种有效的方式监听网络状态的变化。这使得应用程序能根据网络状态调整其行为,提高用户体验。通过学习和实践这一知识点,开发者...

    初中级Android开发社招面试之Service及BroadcastReceiver.zip

    自定义广播由应用自行发送和接收,而系统广播是Android系统发出的,例如网络状态改变、电池电量警告等。 在面试中,对于Service和BroadcastReceiver,面试官可能会询问如何正确使用它们、处理生命周期、优化性能、...

    初中级Android开发社招面试之Service及BroadcastReceiver.pdf

    - 监听Service状态并采取相应措施。 - 将应用安装到/system/app目录,使其成为系统应用,但这需要设备root权限。 4. Service中的耗时操作: 由于Service默认运行在主线程,因此不应直接执行耗时操作,否则可能...

    Android:Intent&Activity,Service,BroadcastReceiver

    在实际项目中,开发者需要灵活运用Intent进行页面跳转和数据传递,妥善管理Activity的生命周期以优化用户体验,使用Service处理后台任务,以及利用BroadcastReceiver监听系统或自定义广播事件,从而实现各种复杂的...

    Android通过Service实现简单的音乐播放

    我们使用 Started Service 来实现音乐播放,并且使用 BroadcastReceiver 来接收服务的状态变化。通过本文,读者可以了解 Android 中的 Service 组件,并且学习如何使用 Service 来实现音乐播放等功能。 知识点: 1...

    安卓 监听网络及WIFI状态Demo

    在安卓应用开发中,监听网络和WIFI状态是一项常见的需求,尤其对于那些依赖网络服务的应用来说,实时了解网络状态并做出相应处理至关重要。本Demo主要展示了如何在安卓APP中实现网络和WIFI状态的监听,包括连接状态...

    Android-实时监控网络状态

    本文将详细讲解如何实现Android应用程序的网络状态监控,包括使用Service进行实时监控以及如何处理网络变化的通知。 首先,Android系统提供了一系列API来获取网络状态,如ConnectivityManager和NetworkInfo接口。...

    安卓应用BroadcastReceiver源码.rar

    总的来说,BroadcastReceiver源码实例提供了实际操作的范例,可以帮助开发者深入理解BroadcastReceiver的工作原理和使用技巧,从而在Android开发中更灵活地应对各种系统事件。通过分析源码,我们可以学习到如何优雅...

    android 广播监听网络变化

    在Android中,通过创建BroadcastReceiver并监听`android.net.conn.CONNECTIVITY_CHANGE`广播,我们可以实时监测网络状态的变化。无论是静态还是动态注册广播接收器,都能有效地帮助我们的应用及时响应网络状态的改变...

    监听Android手机网络变更

    综上所述,监听Android手机网络状态变化主要涉及ConnectivityManager、BroadcastReceiver以及ACTION_NETWORK_STATE_CHANGED广播。通过正确使用这些工具,开发者可以确保应用在各种网络环境下正常工作,提高用户体验...

    Android中动态注册广播监听者,监听网络变化

    总的来说,动态注册广播监听网络变化是一种灵活且实用的方法,可以帮助开发者在应用运行时实时监控网络状态,从而根据网络状况做出相应的业务处理。通过以上步骤,你可以实现Android应用对网络状态变化的动态监听...

Global site tag (gtag.js) - Google Analytics