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 条评论
登录 后参与评论

相关文章

来自专栏GIS讲堂

Arcgis For Android之GPS定位实现

1832
来自专栏向治洪

仿qq最新侧滑菜单

为了后续对这个项目进行优化,比如透明度动画、背景图的位移动画,以及性能上的优化。 我把这个项目上传到github上面,请大家随时关注。 github地址 htt...

4609
来自专栏浅探ARKit

ARKit同时检测水平平面和竖直平面

ARKit1.5里,新增了检测竖直平面的功能。为此特意写一个demo。 下面是效果图: [IMG_3728.PNG] 和之前的水平平面相比 其实就是把多一个属性...

40510
来自专栏Phoenix的Android之旅

关于UI的容易弄错的入门知识

写过 UI的同学一定知道 layout_gravity和 gravity这两个属性,

652
来自专栏增长技术

App Intro相关

##How to use Add this to your build.gradle:

712
来自专栏Winter漫聊技术

Android : 四行代码,优雅返回

为了防止用户误触返回键,还在使用 “再按一次退出” 吗? 追求简约与极速的时代,这种交互显然已经Out了嘛~

1072
来自专栏潇涧技术专栏

Head First Android SwipeRefreshLayout

本文内容和代码参考自Implementing Swipe to Refresh, an Android Material Design UI Pattern,原...

922
来自专栏何俊林

直播项目之仿全民TV(已开源)

前言:成印昨天发布了他最近闭关10天,开发的一个直播开源项目,我体验了下,觉得还不错,推荐给大家,点击文末【阅读原文】,可访问项目的github地址,觉得不错,...

3228
来自专栏Sorrower的专栏

界面无小事(二): 让RecyclerView展示更多不同视图

932
来自专栏向治洪

android wheelview实现三级城市选择

很早之前看淘宝就有了ios那种的城市选择控件,当时也看到网友有分享,不过那个写的很烂,后来(大概是去年吧),我们公司有这么一个项目,当时用的还是网上比较流行的那...

3926

扫码关注云+社区