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

Android递增计时器:如何实现点击屏幕暂停与续播的切换功能

搞定Android计时器的暂停与续播功能

我来帮你解决这个问题!你已经完成了计时器启动和暂停标识切换的基础工作,只需要补充几个关键变量和逻辑,就能实现点击切换暂停/续播的需求。

核心思路

要实现暂停后从原位置续播,关键是记录暂停时已经累计的时间,续播时从这个时间点继续累加,同时用Handler来控制计时的循环启动与停止。

具体实现步骤

1. 补充必要的成员变量

除了你已有的mVisible,还需要这几个变量来管理计时状态:

private long mElapsedTime = 0; // 记录累计的毫秒数
private Handler mHandler = new Handler(Looper.getMainLooper());
private boolean mIsRunning = false; // 标记计时器是否正在运行
private Runnable mTimerRunnable; // 计时的Runnable任务

2. 初始化计时任务

在Activity的onCreate或者onResume方法里,初始化计时的Runnable逻辑:

mTimerRunnable = new Runnable() {
    @Override
    public void run() {
        mElapsedTime += 1000; // 这里以每秒递增为例,你可以根据需求调整间隔
        // 更新UI:比如把mElapsedTime转换成时分秒显示在TextView上
        updateTimerDisplay(mElapsedTime);
        
        if (mIsRunning) {
            mHandler.postDelayed(this, 1000); // 继续循环计时
        }
    }
};

3. 启动计时器(页面打开时触发)

在页面启动时(比如onResume)启动计时器:

@Override
protected void onResume() {
    super.onResume();
    startTimer();
}

private void startTimer() {
    if (!mIsRunning) {
        mIsRunning = true;
        mHandler.post(mTimerRunnable);
    }
}

4. 处理屏幕点击的暂停/续播逻辑

给Activity的根布局设置点击事件(或者给整个View设置),切换状态:

// 在onCreate里设置点击监听
getWindow().getDecorView().setOnClickListener(v -> {
    mVisible = !mVisible;
    // 更新暂停标识的显示(你已经实现了这部分,比如显示/隐藏暂停图标)
    togglePauseIndicator(mVisible);
    
    if (mVisible) {
        // 点击后显示暂停标识,停止计时器
        pauseTimer();
    } else {
        // 再次点击隐藏暂停标识,继续计时
        resumeTimer();
    }
});

// 暂停计时器
private void pauseTimer() {
    if (mIsRunning) {
        mIsRunning = false;
        mHandler.removeCallbacks(mTimerRunnable); // 移除未执行的任务,停止循环
    }
}

// 续播计时器
private void resumeTimer() {
    if (!mIsRunning) {
        mIsRunning = true;
        mHandler.post(mTimerRunnable); // 从当前累计时间继续计时
    }
}

5. 处理生命周期,避免内存泄漏

在Activity进入后台时停止计时器,防止后台运行浪费资源:

@Override
protected void onPause() {
    super.onPause();
    pauseTimer();
}

@Override
protected void onDestroy() {
    super.onDestroy();
    mHandler.removeCallbacksAndMessages(null); // 清空Handler所有任务,避免内存泄漏
}

关键说明

  • mElapsedTime是核心:它记录了从启动到现在的累计时间,暂停时不会重置,续播时继续累加,这样就能实现从暂停点继续计时。
  • Handler的任务管理:暂停时一定要调用removeCallbacks移除Runnable,否则计时器会继续偷偷运行;续播时重新post任务即可。
  • 如果你的计时精度要求更高,可以把1000毫秒的间隔调小(比如100毫秒),但注意UI更新不要太频繁影响性能。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 10:07:03