权限
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
当前网状
非
<uses-permission android:name="android.permission.INTERNET" />
上网
动态注册
NetworkChangeReceiver
package receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import util.ToastUtils;
import static android.content.Context.CONNECTIVITY_SERVICE;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
/**
* Created on 2018/7/5.
*
* @desc 网络状态变化接收器
*/
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
switch (networkInfo.getType()) {
case TYPE_MOBILE:
ToastUtils.shortShow("正在使用2G/3G/4G网络");
break;
case TYPE_WIFI:
ToastUtils.shortShow("正在使用wifi上网");
break;
default:
break;
}
} else {
ToastUtils.shortShow("当前无网络连接");
}
}
}
BaseActivity
private NetworkChangeReceiver networkChangeReceiver;
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction("android.net.conn.CONNECTIVITY_CHANGE");
networkChangeReceiver = new NetworkChangeReceiver();
registerReceiver(networkChangeReceiver, intentFilter);
@Override
protected void onDestroy() {
super.onDestroy();
unregisterReceiver(networkChangeReceiver);
}
静态注册
8.0前
NetworkChangeReceiver
package receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import util.ToastUtils;
import static android.content.Context.CONNECTIVITY_SERVICE;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
/**
* Created on 2018/7/5.
*
* @desc 网络状态变化接收器
*/
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
switch (networkInfo.getType()) {
case TYPE_MOBILE:
ToastUtils.shortShow("正在使用2G/3G/4G网络");
break;
case TYPE_WIFI:
ToastUtils.shortShow("正在使用wifi上网");
break;
default:
break;
}
} else {
ToastUtils.shortShow("当前无网络连接");
}
}
}
AndroidManifest.xml
<receiver
android:name="receiver.NetworkChangeReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE"
tools:ignore="BatteryLife" />
</intent-filter>
</receiver>
8.0后
NetworkChangeReceiver
package receiver;
import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import util.ToastUtils;
import static android.content.Context.CONNECTIVITY_SERVICE;
import static android.net.ConnectivityManager.TYPE_MOBILE;
import static android.net.ConnectivityManager.TYPE_WIFI;
/**
* Created on 2018/7/5.
*
* @desc 网络状态变化接收器
*/
public class NetworkChangeReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
ConnectivityManager connectionManager = (ConnectivityManager) context.getSystemService(CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = connectionManager.getActiveNetworkInfo();
if (networkInfo != null && networkInfo.isAvailable()) {
switch (networkInfo.getType()) {
case TYPE_MOBILE:
ToastUtils.shortShow("正在使用2G/3G/4G网络");
break;
case TYPE_WIFI:
ToastUtils.shortShow("正在使用wifi上网");
break;
default:
break;
}
} else {
ToastUtils.shortShow("当前无网络连接");
}
}
}
AndroidManifest.xml
<receiver
android:name="receiver.NetworkChangeReceiver"
android:enabled="true"
android:exported="true">
<intent-filter>
<action
android:name="android.net.conn.CONNECTIVITY_CHANGE"
tools:ignore="BatteryLife" />
</intent-filter>
</receiver>
显示意图
Intent intent = new Intent();
intent.setAction("android.net.conn.CONNECTIVITY_CHANGE");
// 法一(参一app包名,参二自定广播路径)
ComponentName componentName = new ComponentName("com.self.zsp.dfs", "receiver.NetworkChangeReceiver");
// 法二
// ComponentName componentName = new ComponentName(this,"receiver.NetworkChangeReceiver");
intent.setComponent(componentName);
sendBroadcast(intent);
问题
java.lang.SecurityException: Permission Denial: not allowed to send broadcast android.net.conn.CONNECTIVITY_CHANGE from pid=6435, uid=11409
分析
You are not allowed to send this broadcast. If applications could send this broadcast then this could cause problems on the device. This is a protected system broadcast.
注意
- 头进页
onCreate()
注册广播提示 - 页可见时网状变提示
onPause()->onResume()
无提示(广播已注册)- wifi连接时2G/3G/4G变无提示,2G/3G/4G时连接wifi变有提示