【问题标题】:Allow App Timer To Run When Screen Is Locked允许应用计时器在屏幕锁定时运行
【发布时间】:2016-06-01 16:57:11
【问题描述】:

我正在为 Android 制作自己的运行应用程序,并且我有一个计时器,它应该使用 TextToSpeech 每 5 分钟宣布一次时间。我正在使用Chronometer.OnChronometerTickListener 来跟踪时间并触发音频输出。当手机插入电脑时它工作正常,但是当我拔下手机并锁定屏幕时,计时器监听器似乎在大约 30 秒后进入睡眠状态(因此音频不起作用)。有什么办法可以预防吗?

【问题讨论】:

    标签: java android time timer chronometer


    【解决方案1】:

    大多数时候,当屏幕关闭时需要做某事时,它是在service 中完成的。

    (www.slideshare.net)

    假设您从文档中不知道服务是什么:

    服务是一个应用程序组件,代表一个 应用程序希望在不执行长时间运行的操作时 与用户交互或为其他人提供功能 要使用的应用程序。每个服务类必须有一个对应的 在其包的 AndroidManifest.xml 中声明。服务 可以使用 Context.startService() 和 Context.bindService() 启动。

    所以基本上,它只是在后台运行的东西,包括屏幕关闭时。正如 android 文档所指定的那样,您可能会面临服务被系统杀死的问题:

    请注意,这意味着您的服务大部分时间都在运行,它可能 如果内存压力过大,会被系统杀死。如果这 发生这种情况时,系统稍后会尝试重新启动服务。一个 这样做的重要后果是,如果您实施 onStartCommand() 安排工作以异步方式或在 另一个线程,那么您可能想要使用 START_FLAG_REDELIVERY 系统会为您重新发送 Intent,以免丢失 如果您的服务在处理时被终止。

    在这种情况下,您需要添加某些代码以将服务保持在前台并确保它不会被杀死:

    startForeground();//keeps service from getting destroyed.
    

    这可能提供的唯一问题是服务处于活动状态时的持续通知。

    你也可以使用startSticky():

    @Override
    public int onStartCommand(Intent intent, int flags, int startId) {
    
           // We want this service to continue running until it is explicitly
           // stopped, so return sticky.
           return START_STICKY;
    }
    

    现在,假设您已完成计时器。您可以使用:

    stopSelf();
    

    停止服务,或:

    Context.stopService();
    

    不过,这个通知并不是什么大问题,因为服务运行时屏幕很可能是关闭的。您还可以自定义通知,让用户知道后台发生的事情会更好。

    如果您需要更多帮助,请随时提出。

    ~鲁基尔

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-10-12
      • 2023-03-05
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2017-07-10
      • 1970-01-01
      相关资源
      最近更新 更多