【问题标题】: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();
不过,这个通知并不是什么大问题,因为服务运行时屏幕很可能是关闭的。您还可以自定义通知,让用户知道后台发生的事情会更好。
如果您需要更多帮助,请随时提出。
~鲁基尔