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博客

相关推荐
It's now21 分钟前
Spring AI 基础开发流程
java·人工智能·后端·spring
cxh_陈22 分钟前
线程的状态,以及和锁有什么关系
java·线程·线程的状态·线程和锁
计算机毕设VX:Fegn089524 分钟前
计算机毕业设计|基于springboot + vue图书商城系统(源码+数据库+文档)
java·数据库·vue.js·spring boot·后端·课程设计
R.lin36 分钟前
Java 8日期时间API完全指南
java·开发语言·python
毕设源码-赖学姐43 分钟前
【开题答辩全过程】以 高校教学质量监控平台为例,包含答辩的问题和答案
java·eclipse
高山上有一只小老虎1 小时前
翻之矩阵中的行
java·算法
火钳游侠1 小时前
java单行注释,多行注释,文档注释
java·开发语言
曼巴UE51 小时前
UE FString, FName ,FText 三者转换,再次学习,官方文档理解
服务器·前端·javascript
code bean1 小时前
【CMake】为什么需要清理 CMake 缓存文件?深入理解 CMake 生成器切换机制
java·spring·缓存
selt7912 小时前
Redisson之RedissonLock源码完全解析
android·java·javascript