一、简介
现在手机ROM状态栏上都有网速显示,但是aosp本身是没有的,需要我们自己去添加,添加后如图所示:
二、实现步骤
2.1 新建NetShowView
在frameworks\base\packages\SystemUI\src\com\android\systemui\statusbar\phone
路径下新建一个NetShowView,继承自TextView,用于显示网速,代码如下:
ini
public class NetShowView extends TextView {
private long lastTotalRxBytes = 0;//上一次获取的总消耗流量
private long lastTimeStamp = 0;//记录上一次时间
private String mSpeed="";
private Context mContext;
private Handler mHandler;
private Runnable task = new Runnable() {
@Override
public void run() {
showNetSpeed();
Log.v("NetShowView", "mSpeed: " + mSpeed);
NetShowView.this.setText(mSpeed);
mHandler.postDelayed(task,1000);
}
};
public NetShowView(Context context) {
this(context,null);
}
public NetShowView(Context context, AttributeSet attrs) {
this(context, attrs,0);
}
public NetShowView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
this.mContext = context;
initData(context);
}
private void initData(Context context) {
mHandler = new Handler();
start();
}
private void start(){
lastTotalRxBytes = TrafficStats.getTotalRxBytes();
lastTimeStamp = System.currentTimeMillis();
mHandler.post(task);
}
private void stop(){
mHandler.removeCallbacks(task);
}
/**
* 用于计算网速
*/
private void showNetSpeed() {
long nowTotalRxBytes = TrafficStats.getTotalRxBytes();
long nowTimeStamp = System.currentTimeMillis();
//modify by wxc on 20180111
long 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;
}
}
代码比较简单,就不过多的赘述了,只是简单的用于计算并显示
2.2 status_bar布局添加NetShowView
在frameworks\base\packages\SystemUI\res\layout\system_icons.xml
z中去添加该View
ini
<com.android.systemui.statusbar.phone.NetShowView
android:layout_width="wrap_content"
android:layout_height="match_parent"
android:textStyle="bold"
android:gravity="center_vertical"
android:textColor="#ffffff"
android:textSize="12sp"/>
三、编译验证效果
这里是单编SystemUI模块
进入到frameworks\base\packages\SystemUI
目录中,执行mm命令
编译完成后,通过adb将out路径下的SystemUI.apk(编译完能看到路径)推送到手机上的product/priv-app/SystemUI/SystemUI.apk
然后重启机器就可以了
arduino
adb root
adb remount
//如果remount失败的话,则需要关闭验证在执行remount命令
adb disable-verity
adb push...
四、总结
这里只是做个演示,还有很多可以优化的地方
比如增加设置里面添加开关控制显示、视图位置调整、联网监听(有网络时才会显示)等,整完这些还是要花费不少的功夫,等以后有时间我再整吧,有兴趣的先看下参考文章,顺便吐槽下FrameWork的调试比应用的麻烦多了,还费时间