当手机处于睡眠/待机模式时,Android应用程序失去声音/计时功能

当手机处于睡眠/待机模式时,Android应用程序失去声音/计时功能,android,mobile-application,sleep-mode,Android,Mobile Application,Sleep Mode,几年前,我写了一个android应用程序,这个程序相当简单。我设置了一个由不同步速(步行、慢跑、冲刺)组成的条件系列,每个阶段的时间都与之相关:步行1分钟、工作2分钟、冲刺3分钟。当我按下go按钮时,应用程序将显示每个区段的倒计时计时器、完整的计时器和速度(使用GPS)。有一个显示器,但主要功能是,应用程序使用声音告诉我距离下一个过渡还有多长时间,以及下一个过渡是什么 例如,当它启动时,它每秒产生一个声音,持续5秒,然后说“2分钟”。在30秒标记处会发出声音。在1分钟时,它会说“1分钟”,30秒

几年前,我写了一个android应用程序,这个程序相当简单。我设置了一个由不同步速(步行、慢跑、冲刺)组成的条件系列,每个阶段的时间都与之相关:步行1分钟、工作2分钟、冲刺3分钟。当我按下go按钮时,应用程序将显示每个区段的倒计时计时器、完整的计时器和速度(使用GPS)。有一个显示器,但主要功能是,应用程序使用声音告诉我距离下一个过渡还有多长时间,以及下一个过渡是什么

例如,当它启动时,它每秒产生一个声音,持续5秒,然后说“2分钟”。在30秒标记处会发出声音。在1分钟时,它会说“1分钟”,30秒时会发出另一个声音,然后在改变配速前10秒,它会说“下一条腿(慢跑)(或步行或冲刺)”,并在最后5秒播放一个声音。这样我就不需要看显示器就知道我在创建的条件程序中的位置

问题是:当我创建并运行它的时候,我运行的是两个版本的Android,比现在的版本(8.1.0)落后,现在我在LG Stylo 4上运行它。那时,设备将进入睡眠/待机模式,屏幕自动变暗,或者我按下电源按钮,应用程序将继续正常运行。时间会滴答作响,声音会准时发出

这是我第一次在新手机/操作系统上安装并运行我的应用程序,可以说它运行得不太顺利。有一次,我觉得我还有30秒的时间,一分钟多没有听到任何声音。现在,应用程序似乎暂停了一半,30秒变成了1分钟,并且在过渡过程中没有声音

安卓系统发生了一些变化,这似乎在过去的版本中没有发生。我想要的是,当设备切换到睡眠模式时,程序能够实时运行,而当我读到将应用程序从电池节省中排除时,这是行不通的

我怎样才能让这个应用程序在后台运行,甚至在手机处于睡眠模式时也能倒计时并发出声音

  • 操作系统版本是8.1.0
  • 内核3.18.71
  • 构建OPM1.171019.019
  • 设备:LM-Q710TS(LG Stylo 4)
所讨论的具体代码如下:

    //runs without a timer by reposting this handler at the end of the runnable
Handler timerHandler = new Handler();
Runnable timerRunnable = new Runnable() {

    @Override
    public void run() {

        // do something here to display

        processTime();    // process what to be done on a sec by sec basis
        try {
            timerHandler.postDelayed(this, 1000);
        } catch (Exception ex){

        }

    }
};

我看到一篇文章提到使用部分wakelock或者其他版本的timer,但现在找不到。希望对这个难题有一个直截了当的答案。

我忘了提到,过去我会同时(有时)运行edomondo,所以这可能与此有关,但很多时候我只是自己运行应用程序。我不太确定这是否是你问题的根源,但可能与此有关。也许在a中运行有问题的代码就是解决方案。谢谢。第一个链接没有直接讨论计时器之类的操作,但它确实涉及声音,我使用声音作为计时器的一部分。设置前台服务可能有效,但愚蠢的问题是,什么构成服务。我有一个应用程序(据我所知,android)而不是服务。我可以将应用程序设置为服务吗?代码片段不清楚,但这会出现在启动计时器的OnCreate函数中吗?就我而言,没有愚蠢的问题:)要创建前台服务,您需要扩展服务类并调用
startForegroundService()
a
Context
对象(可能是您的活动)。然后,在服务类中,您可以调用
startForeground
。例如,请参见问题,在顶部答案中,您可以找到指向示例项目的链接,为了完整起见,我也将在此处添加该链接(),我不知道“写入日志”是什么意思,但通常前台服务应该在此处工作,通过快速阅读您的代码,我认为应该可以将相关代码重构为服务。例如,继续播放歌曲的音频播放器使用前台服务,因此我认为它应该适合您的需要。