本篇文章教大家如何在状态栏中加入网速实时监控,效果如下图所示

上图就是要实现的效果,我们可以通过自定义一个View,让它继承TextView,然后在该View内部添加获取实时网络并显示出来的逻辑,废话不多说,看一下代码

首先,在frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone下新建一个NetShowView,让它继承TextView

private long lastTotalRxBytes = 0;//上一次获取的总消耗流量  private long lastTimeStamp = 0;//记录上一次时间private String mSpeed="";private Paint mPaint;private Rect mBound;private Context mContext;private SettingsValueChangeContentObserver mContentOb;//监控数据库,是否打开网速显示private NetworkConnectReceiver mNetReceiver;private boolean mIsConn;//判断当前是否有网络连接public NetShowView(Context context, AttributeSet attrs) {super(context, attrs);setPaint(context);}private void setPaint(Context context){mContext=context;mPaint=new Paint();mPaint.setAntiAlias(true);mPaint.setColor(this.getCurrentTextColor());mPaint.setTextSize(getTextSize());mBound = new Rect();checkNetConnInit();}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);mPaint.getTextBounds(mSpeed, 0, mSpeed.length(), mBound);canvas.drawText(mSpeed, getWidth() - mBound.width()-10, getHeight() / 2 + mBound.height() / 2, mPaint);}

首先在该类里定义一些变量,在构造方法中初始化一些Paint的属性,并在onDraw方法中将网速mSpeed显示上去,以上内容比较简单,不再详述,我们看到在setPaint方法中有一个checkNetConnInit()方法,我们来看一下它的具体实现

 private void checkNetConnInit(){if(mContentOb==null){mContentOb = new SettingsValueChangeContentObserver();mContext.getContentResolver().registerContentObserver(Settings.Global.getUriFor(Settings.Global.NETWORK_SPEED),true, mContentOb);}if(mNetReceiver==null){mNetReceiver= new NetworkConnectReceiver();IntentFilter filter = new IntentFilter();filter.addAction(ConnectivityManager.CONNECTIVITY_ACTION);filter.addAction(NetSpeedService.SEND_ACTION);mContext.registerReceiver(mNetReceiver, filter);}

该类分别作了两个操作,初始化SettingsValueChangeContentObserver为其注册监听,然后初始化NetworkConnectReceiver为其注册事件,为其添加了两个action,分别为ConnectivityManager.CONNECTIVITY_ACTION和NetSpeedService.SEND_ACTION,ConnectivityManager.CONNECTIVITY_ACTION这个action是用来监听网络是否连接的,NetSpeedService.SEND_ACTION这个暂时先不看,稍后分析,我们来看一下SettingsValueChangeContentObserver和NetworkConnectReceiver的具体实现

class SettingsValueChangeContentObserver extends ContentObserver {public SettingsValueChangeContentObserver() {super( new Handler());}@Overridepublic void onChange(boolean selfChange) {super.onChange(selfChange);if(mIsConn){int state=Settings.Global.getInt(mContext.getContentResolver(), Settings.Global.NETWORK_SPEED,0);if(state==1){start();//开始显示网速}else{stop();//停止显示网速}}}  }
class NetworkConnectReceiver extends BroadcastReceiver {@Overridepublic void onReceive(Context context, Intent intent) {if (ConnectivityManager.CONNECTIVITY_ACTION.equals(intent.getAction())) {NetworkInfo info = intent.getParcelableExtra(ConnectivityManager.EXTRA_NETWORK_INFO);if (info != null) {if (NetworkInfo.State.CONNECTED == info.getState()) {mIsConn = true;boolean isOpen = Settings.Global.getInt(context.getContentResolver(),Settings.Global.NETWORK_SPEED, 0) == 1;if (isOpen) {start();} else {stop();}} else {mIsConn = false;stop();}}}if (intent.getAction().equals(NetSpeedService.SEND_ACTION)) {showNetSpeed();}}
}

SettingsValueChangeContentObserver这个内容观察者监听Settings.Global.NETWORK_SPEED的值变化,这个是我们在SettingProvider中自定义的一个全局变量,我们用它来为网速显示提供一个控制开关,当Settings.Global.NETWORK_SPEED值为1显示网速,为0则关闭网速显示,默认关闭

NetworkConnectReceiver中定义了两个action,我们首先来看一下ConnectivityManager.CONNECTIVITY_ACTION这个action,当NetworkConnectReceiver接收到这个事件后,代表当前打开了数据流量或者连上了WiFi,然后经过一系列判断后,我们根据网络状态和Settings.Global.NETWORK_SPEED的值调用start()方法和stop()方法,下面我们来看一下这两个方法做了什么操作

private void start(){lastTotalRxBytes = TrafficStats.getTotalRxBytes();  lastTimeStamp = System.currentTimeMillis();mContext.startService(new Intent(mContext, NetSpeedService.class));setVisibility(View.VISIBLE);}
 private void stop(){mContext.stopService(new Intent(mContext, NetSpeedService.class));setVisibility(View.GONE);}     

start()方法中通过TrafficStats.getTotalRxBytes()获取了总接收流量,并赋予lastTotalRxBytes,开启了服务NetSpeedService,设置当前Visble为可见,stop方法调用了NetSpeedService的停止方法以及设置当前Visble为不可见,两个方法都比较简单,回过头来我们看一下NetworkConnectReceiver的另一个事件NetSpeedService.SEND_ACTION,这里调用了showNetSpeed()方法,这个方法就是计算显示网速的方法,我们来看一下具体实现

private void showNetSpeed() {  long nowTotalRxBytes = TrafficStats.getTotalRxBytes();  long nowTimeStamp = System.currentTimeMillis();//modify by wxc on 20180111long difTime=nowTimeStamp - lastTimeStamp;if(difTime<=0){mSpeed="0B/s";}else{ String endTotal;long speedTotal=(nowTotalRxBytes-lastTotalRxBytes)*1000/difTime; if(speedTotal<1000){mSpeed=speedTotal+"B/s";}else if(speedTotal<1000*1024){endTotal=String.valueOf(speedTotal % 1024);speedTotal=speedTotal/1024;if(endTotal.length()>1){endTotal=endTotal.substring(0, 1);}mSpeed=speedTotal+"."+endTotal+"K/s";}else{endTotal=String.valueOf(speedTotal% (1024*1024));speedTotal=speedTotal/1024/1024;if(endTotal.length()>1){endTotal=endTotal.substring(0, 1);}mSpeed=speedTotal+"."+endTotal+"M/s";}}lastTimeStamp = nowTimeStamp;lastTotalRxBytes = nowTotalRxBytes;invalidate();}

以上就是showNetSpeed方法,该方法主要计算了当前网速,并将网速赋值给mSpeed,通过invalidate()方法刷新当前view显示,过程不难,不再详述,这里我们回过头来看一下NetSpeedService这个服务,该服务主要通过scheduledExecutor.scheduleWithFixedDelay方法进行一个周期任务,每隔一秒发送一个NetSpeedService.SEND_ACTION广播,当NetworkConnectReceiver接收到该广播就调用showNetSpeed()方法来刷新网速显示,以下是NetSpeedService的全部代码

public class NetSpeedService extends Service{public static final String SEND_ACTION="SEND_ACTION";private ScheduledExecutorService scheduledExecutor;@Overridepublic void onCreate() {super.onCreate();}@Overridepublic int onStartCommand(Intent intent, int flags, int startId) {stopAddOrSubtract();updateAddOrSubtract();return START_STICKY;}@Overridepublic IBinder onBind(Intent intent) {return null;}@Overridepublic void onDestroy() {super.onDestroy();stopAddOrSubtract();}private void updateAddOrSubtract() {if(scheduledExecutor==null){scheduledExecutor = Executors.newSingleThreadScheduledExecutor();scheduledExecutor.scheduleWithFixedDelay(new Runnable() {@Overridepublic void run() {Intent sendIntent = new Intent(SEND_ACTION);getApplicationContext().sendBroadcast(sendIntent);}}, 0, 1, TimeUnit.SECONDS);}}private void stopAddOrSubtract() {if (scheduledExecutor != null) {scheduledExecutor.shutdownNow();scheduledExecutor = null;}}
}

以上内容完成后自定义的NetShowView就完成了,这时候我们需要将其添加到如图所示的StatusBar上,打开frameworks\base\packages\SystemUI\res\layout\system_icons.xml文件,在此文件中添加该view,大小位置可以自己调节,同时我们可以在Setting中添加一个网速显示的switch开关,通过设置Settings.Global.NETWORK_SPEED的值来实现功能

<com.android.systemui.statusbar.phone.NetShowViewandroid:id="@+id/net_show_text"android:layout_width="56dp"android:layout_height="match_parent"android:textColor="#ffffff"android:visibility="gone"android:textSize="12dip"/>

OK,通过以上的步骤就可以在状态栏添加实时网速监控了,感兴趣的可以自己试试

在状态栏StatusBar中添加网速实时显示相关推荐

  1. android网络测试上传速度慢,【教程】状态栏添加网速 《双排上传速度和下载速度》(转)...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 1.可以显示两种网速,单排.双排.相信有人也加过,而且非常抠门的不发出来. 2.两种网速可以选择显示,有一个设置程序.这个程序也提取来自ADI ...大神 ...

  2. java实时获取android网速_Android实现网速实时监测工具类

    ### 前言 今天在做app功能的时候,突然涉及到要监测网络的实时速度,于是一番折腾,整合了下相关知识,方便以后使用.下面让我们来学习下我封装的一个网速实时监测类--NetSpeed吧 今天涉及内容: ...

  3. Qt中利用定时器QTimer实时显示当前日期和时间

    Qt中利用定时器QTimer实时显示当前日期和时间 时显示当前日期和时间.下面说明方法: 1. 在工程中声明一个全局QTimer对象 QTimer *timer; 2. 在构造函数中定义QTimer, ...

  4. 如何在Ubuntu系统的顶部标题栏中增加CPU/内存/网速实时监控的小控件

    在windows系统下用360加速球用习惯了,老是不自觉的会去关注系统的CPU占用率.内存占用率.网速情况等信息,不知道大家是不是也有这种习惯.那么在linux系统(Ubuntu)下,是否也有类似的工 ...

  5. iOS APP中嵌入网速监测功能

    企鹅的手机管家.一些网页都提供了网速监测功能.在开发过程中我们偶尔也需要开发这个模块,以提示用户网速的状况,增强用户体验. 常见的网络测速方案 通过调研发现,目前常见的网络测速方案只有两种: 方案1: ...

  6. python网络监控程序_Python之利用psutil写一个命令行网速实时监控小程序

    前言: psutil是一个非常强大的跨平台库,这篇文章只使用了psutil的一小小部分的功能. psutil简介: psutil(进程和系统实用程序)是一个跨平台库,用于 在Python中检索有关正在 ...

  7. 实时网速监测app_实时网速-实时网速app安卓版下载v1.0-我爱秘籍

    实时网速app,是一款非常方便实用的手机网速监测软件.平台为用户提供了监测展示流量数据使用情况的功能,用户可以自定义设置界面和展示的显示信息,实时查询手机数据,感兴趣的用户快来下载吧! 实时网速特色 ...

  8. iOS实现网速实时监测

    .h文件 #import <Foundation/Foundation.h> NS_ASSUME_NONNULL_BEGIN extern NSString *const NetworkD ...

  9. 在jekyll模板博客中添加网易云模块

    最近使用GitHub Pages Jekyll 搭建了个人博客,作为一名重度音乐患者,博客里面可以不配图,但是不能不配音乐啊. 遂在博客里面引入了网易云模块,这里要感谢网易云的分享机制,对开发者非常友 ...

最新文章

  1. 使用idea2.5建立maven项目
  2. Vue中使用form表单提交刷新问题
  3. git添加user及repository
  4. Redis常用命令之操作List类型
  5. devops的公开课
  6. android webview卡顿检测_Android webview隐藏后跳转新页面input输入卡顿与白屏渲染慢的问题说明及修复方案...
  7. liunx下搭建mysql主从_linux下搭建mysql主从
  8. python中的lambda函数用法--无需定义函数名的函数或子程序,避免代码充斥着大量单行函数
  9. iOS 13.2“杀后台”严重 被用户狂喷:专业“杀微信”
  10. vb listview扁平表头的列表框
  11. iOS UICollectionView的简单使用和常用代理方法
  12. Ubuntu10.0.4下CyanogenMod编译环境的搭建和可刷机文件的编译及打包
  13. 2月26 ubuntu系统备份还原到相同电脑、另一台电脑
  14. testbed软件测试技巧,基于LDRA Testbed 软件的单元测试
  15. mysql命令分号_MySql常用命令:注意命令后面的分号!
  16. phpnow mysql升级_PHPNOW如何升级PHP
  17. linux系统不能用投影仪,Linux连接投影仪(ubuntu)失败或显示不正常--未测试
  18. mermaid制作饼图
  19. 谁是软件测试的利益相关者?如何识别它们?
  20. 【PPPAR】PPPAR入门知识点

热门文章

  1. 教你3分钟自制音乐播放器
  2. 计算机原理实验红绿灯转换,微机原理实验交通灯控制实验.doc
  3. 如何在Windows中将“显示桌面”图标移动到快速启动栏或任务栏
  4. C++ 加号运算符重载
  5. 服务器物理内存利用率,服务器提高物理内存利用率
  6. Swift MD5加密
  7. 已知分布函数求概率密度例题_高中数学必修一函数知识点总结
  8. ListView在工程中的详细应用(简易记账本)
  9. Windows10 去除各种不常用的右键菜单
  10. commvault oracle容灾,解析Commvault云管理解决方案如何实现数据的一体化管理