aosp-状态栏添加网速提示

一、简介

现在手机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.xmlz中去添加该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的调试比应用的麻烦多了,还费时间

五、参考文章

在状态栏StatusBar中添加网速实时显示_huangchangsheng123的博客-CSDN博客

相关推荐
eternal__day8 分钟前
Spring Cloud 多机部署与负载均衡实战详解
java·spring boot·后端·spring cloud·负载均衡
颜淡慕潇12 分钟前
Redis 实现分布式锁:深入剖析与最佳实践(含Java实现)
java·redis·分布式
疯狂的沙粒17 分钟前
在web-view 加载的本地及远程HTML中调用uniapp的API及网页和vue页面是如何通讯的?
前端·uni-app·html
程序员秘密基地18 分钟前
基于vscode,idea,java,html,css,vue,echart,maven,springboot,mysql数据库,在线考试系统
java·vue.js·spring boot·spring·web app
何中应20 分钟前
【设计模式-5】设计模式的总结
java·后端·设计模式
小妖66621 分钟前
html 滚动条滚动过快会留下边框线
前端·html
heroboyluck35 分钟前
Svelte 核心语法详解:Vue/React 开发者如何快速上手?
前端·svelte
海的诗篇_37 分钟前
前端开发面试题总结-JavaScript篇(二)
开发语言·前端·javascript·typescript
吾日三省吾码37 分钟前
Spring 团队详解:AOT 缓存实践、JSpecify 空指针安全与支持策略升级
java·spring·缓存
琹箐1 小时前
ant-design4.xx实现数字输入框; 某些输入法数字需要连续输入两次才显示
前端·javascript·anti-design-vue