Android 监听网络

Android N移除了CONNECTIVITY_ACTION等隐式广播, 以优化内存使用和电量消耗。面向Android N开发的应用不再接收到这些广播,但可通过ConnectivityManager的requestNetwork方法结合NetworkRequest和ConnectivityManager.NetworkCallback来监听网络变化。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Android N 删除了三项隐式广播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO) 

 

。以帮助优化内存使用和电量消耗。

 

面向 Android N 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在前台运行的应用假设使用BroadcastReceiver请求接收通知,则仍能够在主线程中侦听CONNECTIVITY_CHANGE。

 

当然现在有新的方法可以监听网络情况。

就是使用ConnectivityManager的requestNetwork方法,通过NetworkRequest和ConnectivityManager.NetworkCallback监听。
<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、付费专栏及课程。

余额充值