Android 自定义Wifi信号指示View

最近有需要自定义展示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);
    }

}

这里提供代码下载:WifiStateView

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏互联网软件技术

消息提示框-事件冒泡

923
来自专栏何俊林

仿网易/QQ空间视频列表滚动连播炫酷效果

VideoFeed实现的功能 滚动时不播放,但是要亮起,当前屏幕内,item view显示百分比最大的一个。 停止滚动且手指抬起时自动播放。 播放完当前的视频...

18810
来自专栏葬爱家族

Android高德之旅(3)UI Setting

前两篇讲到了地图的基础显示和地图类型,今天来记录下高德地图交互相关的设置。地图的触摸事件很丰富,有单击、双击、单指拖拽、双指拖拽、双指旋转、双指缩放等,高德提供...

1093
来自专栏向治洪

仿微信语音聊天

如上图,是常见的仿微信的聊天程序,实现的效果如上图所示,由于项目太大,本文只讲录音部分。本项目示例代码:https://github.com/xiangzhih...

40510
来自专栏向治洪

android下拉加载更多

新浪微博,和QQ空间里面,都有那个下拉刷新的效果,另很多人眼前一亮,细细分析,原理原来如此。 在原作者的基础上,写了一些注释,和帮助大家更好的阅读理解,(可...

2116
来自专栏偏前端工程师的驿站

WPF一步一脚印系列(1):万事起头难

  一直从事Asp.Net的开发,而C/S的开发方面简直是一片空白,于是从上星期开始就痛下决心开始学习WPF。我采取的策略是网上看基础资料+做简单的demo练习...

2009
来自专栏增长技术

app字体随系统字体变化问题

511
来自专栏葡萄城控件技术团队

ActiveReports 报表应用教程 (16)---报表导出

葡萄城ActiveReports报表支持多种格式的报表导出,包括PDF、Excel、Word、RTF、HTML、Text、TIFF以及其它图片格式,用户可以将它...

1715
来自专栏张高兴的博客

张高兴的 Xamarin.Forms 开发笔记:Android 快捷方式 Shortcut 应用

3777
来自专栏向治洪

DrawerLayout实现网易新闻抽屉效果

个人感觉网易的客户端比较前卫,有很多新鲜的东西,有时候模仿这些好的客户端能学到很多东西 开始今天的主要课题,下面是网易客户端抽屉模式实现的效果 ? ? 其...

2155

扫码关注云+社区