Dynamischer Broadcast-Überwachungsnetzwerkstatus

BroadcastReceiver wird vielerorts als eines der vier wichtigsten Android-Steuerelemente verwendet. Heute lernen wir, wie man Broadcasts dynamisch registriert, um Netzwerkänderungen zu überwachen.
Zunächst einmal

//网络状态广播接收者
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);
    }

Denken Sie daran, dass Sie die Registrierung in der Methode onDestroy() oder onPause() abbrechen müssen, da es sonst zu einem Speicherverlust kommen kann. Führen Sie die Methode onPause() aus, führen Sie dann die Methode onStop() aus und zerstören Sie sie dann Wenn der Speicher nicht ausreicht, muss das System möglicherweise eine Zerstörung erzwingen, auch wenn die Methode onDestory () nicht ausgeführt werden kann. Die Methode onPause () wird jedoch definitiv ausgeführt. Die aktuelle Produktion von Mobiltelefonen wird jedoch einen relativ großen Betriebsaufwand haben Speicher, und die Wahrscheinlichkeit dieser Situation wird noch geringer sein. Das ist ein wenig Wissen

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

Dann gibt es noch den Code des Rundfunkempfängers

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;
    }

}

Der Code besteht im Wesentlichen aus Folgendem. Wenn es dann eine andere Geschäftslogik gibt, sollte diese in die Methode onReceive() geschrieben werden. In der Methode onReceive() können jedoch keine zeitaufwändigen Vorgänge ausgeführt werden, da die App sonst einen Fehler meldet Ich hoffe, dass jeder beim Schreiben aufmerksam ist

おすすめ

転載: blog.csdn.net/m0_46366678/article/details/125563270