前几天开会,领导突然说让我们增加个功能,和手机WIFI信号图标一样,会随着信号强度的强弱来改变。(因为我们这里所有状态栏都是隐藏了的,所以这些小东西都得自己写了)。
好了,言归正传。我们来说说如何实现这个功能吧!
首先我们屡屡思路,如果要实现这个功能,肯定先得判断是否有网,有网了以后那么我们得判断WIFI打开没有,打开了也得判断连接了没有,连接了也得判断可不可以用~~~(握了棵草,又臭又长)
总之就是这些各种判断,最后呢让我们的图片跟着信号强度来改变就可以了。信号强度分为几个等级,百度一下你就会知道。
WIFI信号强度呢,他不是正数,而是负数,一般分为四个等级。虽然强度值很多,但是行业中已经形成了几个数值来代表不同等级。
0 —— (-55)dbm 满格(4格)信号
(-55) —— (-70)dbm 3格信号
(-70) —— (-85)dbm 2格信号
(-85) —— (-100)dbm 1格信号
废话不多了,大家来看看具体代码如何,我们来探讨探讨:
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageView
android:id="@+id/img_wifi"
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_marginTop="5dp"
android:background="@drawable/wifi" />
LinearLayout>
就这一个,没了· · ·
布局弄好后,那我们开始正文,首先创建一个WIFI类,做一些初始化工作。
/**
* Created by 79442
* on 2016/10/13.
*
* WIFI信号强度检测
*
* 5秒检测一次发送Handler改变UI线程效果
*/
public class WIFI {
private WifiInfo wifiInfo = null;//获得的wifi信息
private WifiManager wifiManager = null;//wifi管理器
public Context context;
private int level;//信号强度
public void initWifi(Context context) {
//获得wifiManager
wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
//使用定时器,每隔5秒获得一次信号强度值
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
@Override
public void run() {
wifiInfo = wifiManager.getConnectionInfo();
//获得信号强度值
level = wifiInfo.getRssi();
//根据获得信号的强度发送信息
if (level <= 0 && level >= -50) {
mhandler.sendEmptyMessage(1);
} else if (level < -50 && level >= -70) {
mhandler.sendEmptyMessage(2);
} else if (level < -70 && level >= -80) {
mhandler.sendEmptyMessage(3);
} else if (level < -80 && level >= -100) {
mhandler.sendEmptyMessage(4);
} else {
mhandler.sendEmptyMessage(5);
}
}
}, 1000, 5000);
}
/**
* 使用Handler实现UI线程与Timer线程之间的信息传递,每5秒告诉UI线程获得wifiInfo
* */
Handler mhandler = new Handler(){
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
switch (msg.what){
//如果收到正确的消息就获取wifiInfo,改变图片并显示信号强度
case 1:
BaseActivity.img_wifi.setImageResource(R.drawable.wifi03);
Log.i("info","信号强度:"+level+"信号最好");
break;
case 2:
BaseActivity.img_wifi.setImageResource(R.drawable.wifi02);
Log.i("info","信号强度:"+level+"信号较好");
break;
case 3:
BaseActivity.img_wifi.setImageResource(R.drawable.wifi01);
Log.i("info","信号强度:"+level+"信号一般");
break;
case 4:
BaseActivity.img_wifi.setImageResource(R.drawable.wifi);
Log.i("info","信号强度:"+level+"信号较差");
break;
case 5:
BaseActivity.img_wifi.setImageResource(R.drawable.wifi);
Log.i("info","信号强度:"+level+"无信号");
break;
default:
Log.i("info","信号强度:"+level+"无信号");
break;
}
}
};
}
上面也看到了,为了所有界面都能够用到,我创建了一个BaseActivity,用来进行搭建桥梁。来看看BaseActivity我写了什么· · ·
/**
* Created by 79442
* on 2016/9/23.
*/
public class BaseActivity extends Activity {
public static BaseActivity instance;
public static ImageView img_wifi;
/**
* 网络监听线程
*
* 11:网络断开
* 22:网络良好
*/
public Handler mhandler = new Handler() {
@Override
public void handleMessage(Message msg) {
super.handleMessage(msg);
if (msg.what == 11) {
Log.i("info", "显示网络提示框");
NetworkingTipsDialog.displayDialog(BaseActivity.this);
}
if (msg.what == 22) {
return;
}
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
instance = this;
WIFI wifi = new WIFI();
wifi.initWifi(getApplicationContext());
}
/**
* 控件初始化
* */
public void initView(){
img_wifi = (ImageView) findViewById(R.id.img_wifi);
}
}
只有一个线程用来接收判断后的结果,是否有网,没网的时候弹出来一个提示框。
/**
* Created by 79442
* on 2016/9/22.
*
* 网络监听
*
* 有网时,给线程发送 msg.what = 22 的命令
*
* 没网时,给线程发送 msg.what = 11 的命令
*/
public class NetBroadcastReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
Log.i("info", "正在尝试连接网络");
ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo mobNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_MOBILE);
NetworkInfo wifiNetInfo = connectivityManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
try {
if (!mobNetInfo.isConnected() && !wifiNetInfo.isConnected()) {
BaseActivity.instance.mhandler.sendEmptyMessage(11);
Toast.makeText(context, "已经断开网络", Toast.LENGTH_LONG).show();
Log.i("info", "已经断开网络");
} else {
BaseActivity.instance.mhandler.sendEmptyMessage(22);
Toast.makeText(context, "已经连接网络", Toast.LENGTH_LONG).show();
Log.i("info", "已经连接网络");
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
重点差不多都讲完了,在Activity中,只需要调用一下BaseActivity中的初始化控件的方法就可以了。
public class LoginActivity extends BaseActivity {
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
initView();//获取BaseActivity中初始化控件
}
}
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/layout_login"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingTop="40dp"
android:background="@android:color/black"
tools:context=".activity.LoginActivity">
<LinearLayout
android:layout_width="15dp"
android:layout_height="15dp"
android:layout_alignParentRight="true"
android:layout_marginRight="40dp"
android:orientation="horizontal">
<include layout="@layout/signal"/>
LinearLayout>
RelativeLayout>
我的思路呢,就是启动项目后,检测是否有网络,没网的情况下弹出Dialog,给出提示。连接好后并且网络处于可以使用的情况下,利用Handler进行每隔5秒一次的信号检测,然后更改UI线程中的图片。
差不多都说了,还有什么想知道的留言。