当前位置: 移动技术网 > 移动技术>移动开发>Android > Android自定义View展示Wifi信号强弱指示方法示例

Android自定义View展示Wifi信号强弱指示方法示例

2019年07月24日  | 移动技术网移动技术  | 我要评论

前言

最近因为工作的需要,要自定义展示wifi信号强弱的需要,就通过利用系统广播的方式实现了一个自定义view——wifistateview,下面话不多说了,感兴趣的朋友们一起来看看详细的介绍吧。

实现的效果图如下所示:

用不同的图片来表示wifi信号的强弱,可以自定义wifi信号等级

图标简陋了点,根据需要来替换即可

/**
 * 作者: 叶应是叶
 * 时间: 2017/8/22 18:25
 * 描述:
 */
public class wifistateview extends appcompatimageview {

  private wifimanager wifimanager;

  private wifihandler wifihandler;

  //没有开启wifi或开启了wifi但没有连接
  private static final int level_none = 0;

  //wifi信号等级(最弱)
  private static final int level_1 = 1;

  //wifi信号等级
  private static final int level_2 = 2;

  //wifi信号等级
  private static final int level_3 = 3;

  //wifi信号等级(最强)
  private static final int level_4 = 4;

  private final string tag = "wifistateview";

  private static class wifihandler extends handler {

    //虚引用
    private weakreference<wifistateview> stateviewweakreference;

    wifihandler(wifistateview wifistateview) {
      stateviewweakreference = new weakreference<>(wifistateview);
    }

    @override
    public void handlemessage(message msg) {
      wifistateview wifistateview = stateviewweakreference.get();
      if (wifistateview == null) {
        return;
      }
      switch (msg.what) {
        case level_1:
          wifistateview.setimageresource(r.drawable.wifi_1);
          break;
        case level_2:
          wifistateview.setimageresource(r.drawable.wifi_2);
          break;
        case level_3:
          wifistateview.setimageresource(r.drawable.wifi_3);
          break;
        case level_4:
          wifistateview.setimageresource(r.drawable.wifi_4);
          break;
        case level_none:
        default:
          wifistateview.setimageresource(r.drawable.wifi_none);
          break;
      }
    }
  }

  private broadcastreceiver wifistatereceiver = new broadcastreceiver() {
    @override
    public void onreceive(context context, intent intent) {
      log.e(tag, "action " + intent.getaction());
      switch (intent.getaction()) {
        case wifimanager.wifi_state_changed_action:
          if (wifimanager.getwifistate() == wifimanager.wifi_state_disabling) {
            wifihandler.sendemptymessage(level_none);
          }
          break;
        case wifimanager.rssi_changed_action:
          if (wifimanager.getwifistate() == wifimanager.wifi_state_disabled) {
            wifihandler.sendemptymessage(level_none);
            return;
          }
          wifiinfo wifiinfo = wifimanager.getconnectioninfo();
          int level = wifimanager.calculatesignallevel(wifiinfo.getrssi(), 5);
          log.e(tag, "level:" + level);
          wifihandler.sendemptymessage(level);
          break;
      }
    }
  };


  public wifistateview(context context) {
    this(context, null);
  }

  public wifistateview(context context, @nullable attributeset attrs) {
    this(context, attrs, 0);
  }

  public wifistateview(context context, @nullable attributeset attrs, int defstyleattr) {
    super(context, attrs, defstyleattr);
    wifimanager = (wifimanager) context.getapplicationcontext().getsystemservice(context.wifi_service);
    wifihandler = new wifihandler(this);
  }

  @override
  protected void onattachedtowindow() {
    super.onattachedtowindow();
    intentfilter intentfilter = new intentfilter();
    //wifi连接状态变化
    intentfilter.addaction(wifimanager.wifi_state_changed_action);
    //wifi信号强度变化
    intentfilter.addaction(wifimanager.rssi_changed_action);
    getcontext().registerreceiver(wifistatereceiver, intentfilter);
  }

  @override
  protected void ondetachedfromwindow() {
    super.ondetachedfromwindow();
    wifihandler.removecallbacksandmessages(null);
    getcontext().unregisterreceiver(wifistatereceiver);
  }

}

这里提供代码下载:

github地址:https://github.com/leavesc/wifistateview

本地下载:

总结

以上就是这篇文章的全部内容了,希望本文的内容对各位android开发者们的学习或者工作能带来一定的帮助,如果有疑问大家可以留言交流,谢谢大家对移动技术网的支持。

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网