android 监听网络连接

本文介绍两种监测Android设备网络状态变化的方法:一是通过TelephonyManager监听数据连接状态;二是使用BroadcastReceiver接收网络变化广播。

 final TelephonyManager mTelephonyMgr = (TelephonyManager) getSystemService(TELEPHONY_SERVICE);    

        mTelephonyMgr.listen(new PhoneStateListener(){  

 

            @Override  

            public void onDataConnectionStateChanged(int state) {  

                switch(state){  

                    case TelephonyManager.DATA_DISCONNECTED://网络断开 

                     Toast.makeText(NetConnectActivity.this, "DISCONNECTED", Toast.LENGTH_SHORT).show();

                        break;  

                    case TelephonyManager.DATA_CONNECTING://网络正在连接  

                     Toast.makeText(NetConnectActivity.this, "CONNECTING", Toast.LENGTH_SHORT).show();

                        break;  

                    case TelephonyManager.DATA_CONNECTED://网络连接上  

                     Toast.makeText(NetConnectActivity.this, "CONNECTED", Toast.LENGTH_SHORT).show();

                        break;  

                }  

            }  

 

            }, PhoneStateListener.LISTEN_DATA_CONNECTION_STATE);  



判断网络连接的新方法

class ConnectionChangeReceiver extends BroadcastReceiver{


@Override
public void onReceive(Context arg0, Intent arg1) {
// TODO Auto-generated method stub
ConnectivityManager manager = (ConnectivityManager) arg0.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo moInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiInfo = manager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
if(!moInfo.isConnected()&&!wifiInfo.isConnected()){
Toast.makeText(arg0, "duankai", 0).show();
serviceManager.stopService();

}else{
Toast.makeText(arg0, "连接", 0).show();
serviceManager.startService();
}
}
   
    }

<think>我们正在处理用户关于Android监听网络连接变化的问题。根据引用内容,我们可以总结出实现方法主要涉及广播接收器和ConnectivityManager的使用。以下将分步骤说明实现方法。</think>### Android 监听网络连接变化的实现方法 在 Android 开发中,监听网络连接变化主要通过**广播接收器**和**ConnectivityManager**实现,以下是详细步骤: #### 1. 创建广播接收器 ```java public class NetworkReceiver extends BroadcastReceiver { @Override public void onReceive(Context context, Intent intent) { // 获取网络连接管理器 ConnectivityManager connMgr = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE); // 获取当前活动的网络信息 NetworkInfo networkInfo = connMgr.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { // 网络可用时的处理逻辑 int networkType = networkInfo.getType(); if (networkType == ConnectivityManager.TYPE_WIFI) { Log.d("Network", "WiFi已连接"); } else if (networkType == ConnectivityManager.TYPE_MOBILE) { Log.d("Network", "移动数据已连接"); } } else { // 网络不可用时的处理逻辑 Log.d("Network", "网络连接已断开"); // 可在此处弹出网络设置提示框 } } } ``` #### 2. 注册广播接收器(在Activity/Fragment中) ```java @Override protected void onResume() { super.onResume(); // 创建广播接收器实例 NetworkReceiver receiver = new NetworkReceiver(); // 创建意图过滤器 IntentFilter filter = new IntentFilter(); filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION); // 注册广播接收器 registerReceiver(receiver, filter); } @Override protected void onPause() { super.onPause(); // 取消注册广播接收器 unregisterReceiver(receiver); } ``` #### 3. 添加权限(AndroidManifest.xml) ```xml <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/> ``` #### 关键实现细节: 1. **网络类型判断**: - `ConnectivityManager.TYPE_WIFI`:WiFi连接 - `ConnectivityManager.TYPE_MOBILE`:移动数据连接 - `ConnectivityManager.TYPE_ETHERNET`:有线网络 2. **网络状态判断**: - `networkInfo.isConnected()`:网络是否可用 - `networkInfo.isAvailable()`:网络接口是否就绪 3. **网络切换处理**: ```java // 检查网络切换类型 if (intent.getBooleanExtra(ConnectivityManager.EXTRA_NO_CONNECTIVITY, false)) { // 网络完全断开 } else { // 网络类型发生变化 } ``` #### 4. Android 10+ 适配注意事项 在 Android 10(API 29)及以上版本,需要添加前台服务权限: ```xml <uses-permission android:name="android.permission.FOREGROUND_SERVICE"/> ``` #### 5. 最佳实践建议 1. **减少频繁操作**:网络状态变化可能频繁触发,避免在`onReceive()`中执行耗时操作 2. **使用WorkManager**:对于需要网络的任务,结合`WorkManager`实现网络感知调度 3. **状态缓存**:通过`SharedPreferences`缓存最后一次网络状态,避免重复处理 4. **UI更新**:通过`LocalBroadcastManager`或`LiveData`将网络状态传递到UI层 > 注:在 Android 7.0+ 需注意后台执行限制,建议使用`JobScheduler`替代长时间运行的广播接收器[^1][^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值