android手机网络发生改变系统会发出相应的广播,我们只需要注册该广播就可以实时监测手机网络的变化了。
首先我们创建一个广播NetworkChangedReceiver继承系统广播BroadcastReceiver,在onReceive方法中做对应网络变化的处理逻辑就可以了:
public class NetworkChangedReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
int netWorkStates = NetworkUtil.getNetWorkStates(context);
switch (netWorkStates) {
case NetworkUtil.TYPE_NONE:
//断网了
break;
case NetworkUtil.TYPE_MOBILE:
//打开了移动网络
break;
case NetworkUtil.TYPE_WIFI:
//打开了WIFI
break;
default:
break;
}
}
}
上述代码中使用到了NetworkUtil工具类,详细代码请看NetworkUtil
广播我们已经创建了,接下来注册就可以监听网络状态了,注册广播可以通过代码注册(动态注册)也可以通过清单文件注册(静态注册),下面分别介绍一下:
1. 代码注册:
NetworkChangedReceiver networkChangedReceiver = new NetworkChangedReceiver();
IntentFilter intentFilter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
registerReceiver(networkChangedReceiver, intentFilter);
注意不要忘记在onDestroy()中解除注册
protected void onDestroy() {
unregisterReceiver(networkChangedReceiver);
super.onDestroy();
}
2. 清单文件注册:
<receiver
android:name=".NetworkChangedReceiver">
<intent-filter>
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
</intent-filter>
</receiver>
两种注册方式均可,可根据项目中实际需求来决定使用其中一种。
警告:
清单文件注册不能适配android7.0及以上(targetSdkVersion ≥ N,清单文件注册失效,亲测没有收到广播)
原因:Android 7.0后台优化 详情请点击
Android 7.0 移除了三项隐式广播(CONNECTIVITY_ACTION、ACTION_NEW_PICTURE 和ACTION_NEW_VIDEO),以帮助优化内存使用和电量消耗。
Android 7.0 应用了以下优化措施:
1. 面向 Android 7.0 开发的应用不会收到 CONNECTIVITY_ACTION 广播,即使它们已有清单条目来请求接受这些事件的通知。在 前台运行的应用如果使用 BroadcastReceiver 请求接收通知,则仍可以在主线程中侦听 CONNECTIVITY_CHANGE。
2. 应用无法发送或接收 ACTION_NEW_PICTURE 或 ACTION_NEW_VIDEO 广播。此项优化会影响所有应用,而不仅仅是面向 Android 7.0 的应用。
现在不适配Android 7.0应该不可能了,所以大家就不要考虑清单文件注册了,直接代码动态注册就行了。
如果您对Android 7.0这一变更感觉不适应或者变更限制了您开发的需求,Android 框架提供多个解决方案来缓解对这些隐式广播的需求。例如,JobScheduler API 提供了一个稳健可靠的机制来安排满足指定条件(例如连入无限流量网络)时所执行的网络操作。您甚至可以使用JobScheduler 来适应内容提供程序变化。