Android7.0前,Android系统前网络切换时,会发广播,业务只要监听广播即可。
public class NetChangeReceiver extends BroadcastReceiver {
private static final String ANDROID_NET_CHANGE_ACTION = "android.net.conn.CONNECTIVITY_CHANGE";
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equalsIgnoreCase(ANDROID_NET_CHANGE_ACTION)){
Toast.makeText(context, "Net Changed", Toast.LENGTH_SHORT).show();
}
}
}
清单文件中
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.outman.example.androidtest">
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"/>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/>
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:roundIcon="@mipmap/ic_launcher_round"
android:supportsRtl="true">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
intent-filter>
activity>
<receiver android:name=".NetChangeReceiver">
<intent-filter >
<action android:name="android.net.conn.CONNECTIVITY_CHANGE"/>
intent-filter>
receiver>
application>
manifest>
上面代码,在Android7.0设备前,当网络切换时,能收到消息。而在Android7.0及以上设备,则无法收到。
Android7.0 行为变更上明确说明
解决办法
在android 中注册广播有两种方式,一种是在AndroidManifest.xml中,另一种通过register方法。
Android文档中描述,通过在AndroidManifest.xml中注册方式,App在前后台都无法接收到广播。而通过register的方式,当App在运行时,是可以接收到广播
public class MainActivity extends Activity {
private NetChangeReceiver netChangeReceiver;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
netChangeReceiver = new NetChangeReceiver();
registerReceiver(netChangeReceiver, new IntentFilter("android.net.conn.CONNECTIVITY_CHANGE"));
}
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(netChangeReceiver);
}
}
优化稳定建议
public class MainActivity extends Activity {
private ConnectivityManager.NetworkCallback networkCallback;
private ConnectivityManager connectivityManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
networkCallback = new NetworkCallbackImpl();
NetworkRequest.Builder builder = new NetworkRequest.Builder();
NetworkRequest request = builder.build();
connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
connectivityManager.registerNetworkCallback(request, networkCallback);
}
@Override
protected void onDestroy() {
super.onDestroy();
connectivityManager.unregisterNetworkCallback(networkCallback);
}
private class NetworkCallbackImpl extends ConnectivityManager.NetworkCallback {
@Override
public void onAvailable(Network network) {
super.onAvailable(network);
Toast.makeText(getBaseContext(), "onAvailable", Toast.LENGTH_SHORT).show();
}
@Override
public void onLosing(Network network, int maxMsToLive) {
super.onLosing(network, maxMsToLive);
Toast.makeText(getBaseContext(), "onLosing", Toast.LENGTH_SHORT).show();
}
@Override
public void onLost(Network network) {
super.onLost(network);
Toast.makeText(getBaseContext(), "onLost", Toast.LENGTH_SHORT).show();
}
@Override
public void onCapabilitiesChanged(Network network, NetworkCapabilities networkCapabilities) {
super.onCapabilitiesChanged(network, networkCapabilities);
Toast.makeText(getBaseContext(), "onCapabilitiesChanged", Toast.LENGTH_SHORT).show();
}
@Override
public void onLinkPropertiesChanged(Network network, LinkProperties linkProperties) {
super.onLinkPropertiesChanged(network, linkProperties);
Toast.makeText(getBaseContext(), "onLinkPropertiesChanged", Toast.LENGTH_SHORT).show();
}
}
}
说明
ConnectivityManager提供了很多接口用于获取系统当前的网络连接信息:
getAllNetworkInfo(): 返回所有网络信息
getActiveNetworkInfo():获取当前激活的网络连接信息
getNetworkForType: 获取指定类型的网络
requestNetwork(...) : 请求建立某种类型的网络
setAirplaneMode(): 开启飞行模式
addDefaultNetworkActiveListener() : 监听默认网络连接是否激活
registerNetworkCallback() : 监听某个网络请求的状态,可用时进行回调