You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android设备指定时间间隔网络用量监测实现方法咨询

嘿,作为Android新手碰到这个问题太正常啦,别慌,咱们一步步来搞定它!你说得没错,TrafficStats确实是Android官方提供的获取网络用量的实用工具,但它返回的是从设备开机到当前的累计数据,没法直接给出指定时间间隔内的用量。不过咱们只需要做个简单的“差值计算”,就能轻松实现你要的功能,具体方案如下:

实现指定时间间隔的网络用量监测

核心思路

其实逻辑特别简单:

  • 先记录第一个时间点的网络用量(比如当前的移动数据/总数据接收、发送量)
  • 等过了你设定的时间间隔后,再记录第二个时间点的数值
  • 用第二个数值减去第一个数值,得到的就是这段时间内的实际网络用量

具体实现步骤

1. 先搞定必要的权限

首先得在AndroidManifest.xml里添加权限,不然没法获取流量数据:

<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.READ_PHONE_STATE" />
<!-- Android 10及以上版本,需要这个权限来获取更精准的流量统计 -->
<uses-permission android:name="android.permission.PACKAGE_USAGE_STATS"
    tools:ignore="ProtectedPermissions" />

划重点:PACKAGE_USAGE_STATS是特殊权限,没法直接通过弹窗申请,得引导用户去系统设置里手动授权(一般路径是:设置 → 应用 → 你的应用 → 权限 → 查看所有权限 → 用量统计)。

2. 封装一个流量获取工具类

先写个简单的工具方法,方便随时获取当前的累计流量:

object TrafficUtils {
    // 获取总接收流量(移动+WiFi),单位:字节
    fun getTotalRxBytes(): Long {
        return TrafficStats.getTotalRxBytes()
    }

    // 获取总发送流量,单位:字节
    fun getTotalTxBytes(): Long {
        return TrafficStats.getTotalTxBytes()
    }

    // 获取移动数据接收流量
    fun getMobileRxBytes(): Long {
        return TrafficStats.getMobileRxBytes()
    }

    // 获取移动数据发送流量
    fun getMobileTxBytes(): Long {
        return TrafficStats.getMobileTxBytes()
    }
}

要是你用Java开发,改成静态方法就行,逻辑完全一样。

3. 实现定时监测逻辑

这里推荐用Handler结合postDelayed来做定时任务,在Android里这种方式更适配UI线程,也不容易出问题:

class MainActivity : AppCompatActivity() {
    private lateinit var handler: Handler
    private lateinit var runnable: Runnable
    private var lastRxBytes = 0L // 保存上一次记录的接收流量
    private val monitorInterval = 5000L // 监测间隔,比如设成5秒

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_main)

        // 先初始化第一次的流量数据
        lastRxBytes = TrafficUtils.getTotalRxBytes()

        handler = Handler(Looper.getMainLooper())
        runnable = Runnable {
            // 获取当前的流量数值
            val currentRxBytes = TrafficUtils.getTotalRxBytes()
            // 计算这段时间内的用量
            val usedBytes = currentRxBytes - lastRxBytes
            Log.d("TrafficMonitor", "5秒内接收的流量:${usedBytes / 1024} KB")

            // 更新上一次的记录值,为下一次计算做准备
            lastRxBytes = currentRxBytes
            // 继续执行下一次定时任务
            handler.postDelayed(runnable, monitorInterval)
        }

        // 启动定时监测
        handler.postDelayed(runnable, monitorInterval)
    }

    override fun onDestroy() {
        super.onDestroy()
        // 页面销毁时一定要移除定时任务,避免内存泄漏!
        handler.removeCallbacks(runnable)
    }
}

如果需要在后台持续监测(比如APP退到后台还想统计),那建议用WorkManager或者ForegroundService,因为Android 8.0及以上对后台任务限制很严,普通的后台定时器容易被系统干掉。

一些额外的注意事项

  • TrafficStats的数值会在设备重启后重置,要是你需要跨重启的统计,记得把每次的记录保存到本地(比如SharedPreferences或者数据库)
  • 要是想监测单个APP的流量,可以用TrafficStats.getUidRxBytes(uid),不过得先拿到目标APP的UID
  • Android 10+的话,要是需要更精细的流量统计(比如按小时、按网络类型拆分),可以试试NetworkStatsManager,功能更强大但用法稍微复杂一点

这样应该就能完美满足你的需求啦,有啥细节问题随时问!

内容的提问来源于stack exchange,提问作者ShayanShiravani

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 04:13:02