网状变化监听

权限

<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变有提示

猜你喜欢

转载自blog.csdn.net/zsp_android_com/article/details/80933296