Estado de la red de monitoreo de transmisión dinámica

BroadcastReceiver se usa en muchos lugares como uno de los cuatro controles principales de Android. Hoy aprenderemos cómo registrar transmisiones dinámicamente para monitorear los cambios en la red.
Primero que nada

//网络状态广播接收者
private NetworkStateReceiver netWorkReceiver;
 @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        //注册网络状态监听广播
        netWorkReceiver = new NetworkStateReceiver();
        IntentFilter filter = new IntentFilter();
        filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
        filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
        filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);
        registerReceiver(netWorkReceiver, filter);
    }

Recuerde, debe cancelar el registro en el método onDestroy() o en el método onPause(), de lo contrario puede causar una pérdida de memoria. Ejecute el método onPause(), luego ejecute el método onStop() y luego destrúyalo. En caso de memoria insuficiente, es posible que el sistema lo destruya incluso si el método onDestory() no se puede ejecutar, pero el método onPause() definitivamente se ejecutará, pero la producción actual de teléfonos móviles tendrá una memoria operativa relativamente grande , y la probabilidad de esta situación será aún menor. esto es un poco de conocimiento

  @Override
    protected void onDestroy() {
        super.onDestroy();
        if (netWorkReceiver != null) {
            unregisterReceiver(netWorkReceiver);
        }
    }

Luego está el código del receptor de transmisión.

public class NetworkStateReceiver extends BroadcastReceiver {

    private static long WIFI_TIME = 0;
    private static long ETHERNET_TIME = 0;
    private static long NONE_TIME = 0;
    private static int LAST_TYPE = -3;
    private static String TAG = "Base";

    @Override
    public void onReceive(Context context, Intent intent) {
 
        if (intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) {
            long time = getTime();
            if (time != WIFI_TIME && time != ETHERNET_TIME && time != NONE_TIME) {
                final int netWorkState = getNetWorkState(context);
                if (netWorkState == 0 && LAST_TYPE != 0) {
                    WIFI_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "WIFI", Toast.LENGTH_SHORT).show();
                } else if (netWorkState == 1 && LAST_TYPE != 1) {
                    ETHERNET_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "移动网络", Toast.LENGTH_SHORT).show();
                } else if (netWorkState == -1 && LAST_TYPE != -1) {
                    NONE_TIME = time;
                    LAST_TYPE = netWorkState;
                    Toast.makeText(context, "无网络", Toast.LENGTH_SHORT).show();
                }
            }
        }
    }


    private static final int NETWORK_NONE = -1;  //无网络连接
    private static final int NETWORK_WIFI = 0;   //连接的是WIFI
    private static final int NETWORK_MOBILE = 1; //连接的是数据网络

    //判断网络状态与类型
    public static int getNetWorkState(Context context) {
        ConnectivityManager connectivityManager = (ConnectivityManager)
                context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeNetworkInfo = connectivityManager.getActiveNetworkInfo();
        if (activeNetworkInfo != null && activeNetworkInfo.isConnected()) {
            if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_WIFI)) {
                return NETWORK_WIFI;
            } else if (activeNetworkInfo.getType() == (ConnectivityManager.TYPE_MOBILE)) {
                return NETWORK_MOBILE;
            }
        } else {
            return NETWORK_NONE;
        }
        return NETWORK_NONE;
    }

}

El código es básicamente estos, y luego, si hay alguna otra lógica comercial, debe escribirse en el método onReceive(), pero en el método onReceive(), las operaciones que requieren mucho tiempo no se pueden realizar, de lo contrario, la aplicación informará un error. , espero que presten atención al escribir

Supongo que te gusta

Origin blog.csdn.net/m0_46366678/article/details/125563270
Recomendado
Clasificación