Android监听网络状态变化,随着网络的变化做一些其他处理(亲测可用)

转:https://blog.csdn.net/ca13660049466/article/details/52669115

用广播实现,这是一个通用的类,只需要在需要监听网络变化的类里设置下监听回调即可。

以下是代码:

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.util.Log;
 
import java.util.ArrayList;
import java.util.List;
 
/**
 * Created by Smile on 2016/9/26.
 */
 
public class NetworkChange extends BroadcastReceiver {
 
    public final int wifi = 2, mobile = 1, none = 0;
    public int oldState = none;
    public List<OnNetWorkChange> onNetWorkChange = new ArrayList<>();
    private static NetworkChange networkChange;
 
    public static NetworkChange getInstance() {
        if (networkChange == null) {
            networkChange = new NetworkChange();
        }
        return networkChange;
    }
 
    //回调接口
    public interface OnNetWorkChange {
        //返回各个(wifi,移动网络,没有网络)状态的值,上一个网络状态的值,当前的网络状态的值
        void onChange(int wifi, int mobile, int none, int oldStatus, int newStatus);
    }
 
    /**
     * 增加网络变化监听回调对象
     * 如果设置多个回调,请务必不要设置相同名字的OnNetWorkChange对象,否则会无效
     *
     * @param onNetWorkChange 回调对象
     */
    public void setOnNetWorkChange(OnNetWorkChange onNetWorkChange) {
        if (this.onNetWorkChange.contains(onNetWorkChange)) {
            return;
        }
        this.onNetWorkChange.add(onNetWorkChange);
        Log.i("网络状态", "添加一个回调。已设置:" + this.onNetWorkChange.size());
    }
 
    /**
     * 取消网络变化监听监听回调
     *
     * @param onNetWorkChange 回调对象
     */
    public void delOnNetWorkChange(OnNetWorkChange onNetWorkChange) {
        if (this.onNetWorkChange.contains(onNetWorkChange)) {
            this.onNetWorkChange.remove(onNetWorkChange);
            Log.i("网络状态", "删除一个回调。还有:" + this.onNetWorkChange.size());
        }
    }
 
    /**
     * 触发网络状态监听回调
     *
     * @param nowStatus 当前网络状态
     */
    private void setChange(int nowStatus) {
        for (OnNetWorkChange change : onNetWorkChange) {
            change.onChange(wifi, mobile, none, oldState, nowStatus);
        }
        oldState = nowStatus;
    }
 
    @Override
    public void onReceive(Context context, Intent intent) {
        ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
        NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
        if (onNetWorkChange == null) {
            //当没有设置回调的时候,什么都不做
            return;
        }
        if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
            Log.i("通知", "网络不可以用");
            setChange(none);
        } else if (mobNetInfo.isConnected()) {
            Log.i("通知", "仅移动网络可用");
            setChange(mobile);
        } else if (wifiNetInfo.isConnected()) {
            Log.i("通知", "Wifi网络可用");
            setChange(wifi);
        }
    }
}

这个广播类首先要注册下,推荐在Application类里注册:

  1. IntentFilter filter = new IntentFilter(ConnectivityManager.CONNECTIVITY_ACTION);
  2. registerReceiver(NetworkChange.getInstance(), filter);


使用方法:

home_onChange对象名务必不能出现一样的,不然会导致无效。

  1. private NetworkChange.OnNetWorkChange home_onChange = new NetworkChange.OnNetWorkChange() {
  2. @Override
  3. public void onChange(int wifi, int mobile, int none, int oldStatus, int newStatus) {
  4. if (newStatus == none){
  5. //没有网络
  6. }
  7. if (newStatus == mobile){
  8. //移动网络
  9. }
  10. if (newStatus == wifi){
  11. //wifi网络
  12. if (oldStatus == mobile) {
  13. //从移动网络切换到wifi网络
  14. }
  15. }
  16. }
  17. };

  18. //注册监听网络变化
  19. private void registerReceiver() {
  20. NetworkChange.getInstance().setOnNetWorkChange(home_onChange);
  21. }

  22. //取消监听网络变化
  23. private void unregisterReceiver() {
  24. NetworkChange.getInstance().delOnNetWorkChange(home_onChange);
  25. }


在onCreate里注册回调
NetworkChange.getInstance().setOnNetWorkChange(home_onChange);

在onDestroy里去掉回调

NetworkChange.getInstance().delOnNetWorkChange(home_onChange);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值