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

Android开发:如何让应用在屏幕熄灭时停止运行?

屏幕熄灭时停止健身应用运行的实现方案

针对你的需求,有两种实用方案可以实现屏幕熄灭时停止应用的播报和运动逻辑,下面分别说明:

方案一:利用Activity生命周期回调

屏幕熄灭时,系统会触发Activity的onPause()方法(后续可能进入onStop()),你可以在这个回调里停止所有运行中的逻辑:

  1. 在你的健身Activity中重写onPause()和onResume()方法:
private TextToSpeech tts;
private CountDownTimer workoutTimer; // 替换成你实际使用的计时/调度类

@Override
protected void onPause() {
    super.onPause();
    // 停止TTS播报
    if (tts != null) {
        tts.stop();
    }
    // 取消运动计时器
    if (workoutTimer != null) {
        workoutTimer.cancel();
    }
    // 停止提示音播放等其他运行中逻辑
}

@Override
protected void onResume() {
    super.onResume();
    // 屏幕点亮或回到应用时,恢复当前运动阶段的逻辑
    startCurrentWorkoutPhase();
}

// 补充:在Activity销毁时释放TTS资源,避免内存泄漏
@Override
protected void onDestroy() {
    super.onDestroy();
    if (tts != null) {
        tts.shutdown();
    }
}

注意:这个方案会在应用退到后台(比如切换到其他APP)时也停止逻辑,如果你需要只在屏幕熄灭时停止,建议用方案二。

方案二:监听屏幕状态广播

通过注册系统广播接收器,精准监听屏幕熄灭/点亮的事件:

  1. 在Activity中定义广播接收器:
private BroadcastReceiver screenStateReceiver = new BroadcastReceiver() {
    @Override
    public void onReceive(Context context, Intent intent) {
        String action = intent.getAction();
        if (Intent.ACTION_SCREEN_OFF.equals(action)) {
            // 屏幕熄灭,停止所有运动相关逻辑
            stopWorkoutLogic();
        } else if (Intent.ACTION_SCREEN_ON.equals(action)) {
            // 屏幕点亮,可选恢复运动逻辑
            resumeWorkoutLogic();
        }
    }
};
  1. 在onResume()中注册广播接收器,onPause()中注销:
@Override
protected void onResume() {
    super.onResume();
    IntentFilter filter = new IntentFilter();
    filter.addAction(Intent.ACTION_SCREEN_OFF);
    filter.addAction(Intent.ACTION_SCREEN_ON);
    registerReceiver(screenStateReceiver, filter);
}

@Override
protected void onPause() {
    super.onPause();
    unregisterReceiver(screenStateReceiver);
}
  1. 实现停止和恢复逻辑的方法:
private void stopWorkoutLogic() {
    if (tts != null) {
        tts.stop();
    }
    if (workoutTimer != null) {
        workoutTimer.cancel();
    }
    // 停止提示音等其他运行中组件
}

private void resumeWorkoutLogic() {
    // 根据当前运动进度恢复计时和播报
    startCurrentWorkoutPhase();
}

提示:如果你的运动逻辑是在Service中运行的,那需要在广播接收器中通过绑定Service或者发送Intent的方式通知Service停止运行,原理和上面一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.23 12:54:18