带有 contentobserver 的睡眠服务
我创建了一个托管 ContentObserver (C) 的服务 (S)。 C 跟踪一些数据并记录对数据库 (D) 所做的更改。
S 还有一个计时器,它按时间间隔将 D 的内容转储到文件中。
我的服务在我的手机上运行,并且在一段时间内一切看起来都很好(几个小时左右)。然后突然停止记录对数据所做的更改并停止转储到文件。 我尝试更改数据(在 C 上引发 onChange)并在手机中浏览以保持设备唤醒,但什么也没发生 - 服务仍然处于非活动状态。 S 仍在运行,当我连接到笔记本电脑时,我在日志中没有看到任何错误。
我的猜测是该服务正在休眠(没有获得 CPU 切片)。我读过一些有关唤醒锁的内容,但我不想强制手机始终处于唤醒状态。 ()。 另一种方法是创建一个重复警报,每 T 分钟执行一次 C 的工作(轮询)。 我更喜欢 ContentObservers 的想法,因为用户可以在更新之间更改(尤其是删除)数据。使用 ContentObserver,我将获得所有更改,而不仅仅是按时间间隔的快照。
关于如何定期唤醒我的服务有什么想法吗?
此致 弗雷德里克
I've created a service (S) which hosts a ContentObserver (C).
C keeps track of some data and logs changes made to a database (D).
S also has a timer which dumps the content of D to a file on timed intervals.
I have my service running on my phone and all seems fine for a while (a couple of hours or so). Then suddenly it stops recording changes made to the data and stops dumping to a file.
I tried changing the data (provoking onChange on C) and browsing around in the phone to keep the device awake but nothing happened - service stil inactive.
S is still running and when I connect to my laptop I see no errors in the log.
My guess is that the service is sleeping (gets no CPU slice). I've read a bit about a wakelock but I don't want to force the phone to be awake all the time. ().
An alternative is to create a repeated alarm which carry out the work of C every T minutes (polling).
I like the idea with ContentObservers more because the user can alter (especially delete) data between the updates. With a ContentObserver I will get ALL changes, not just snapshots in timed intervals.
Any ideas on how I can wake my service on a regularbasis?
Best regards
Frederik
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(1)
您可以使用 AlarmManager 以设定的时间间隔广播待处理的意图。如果您使用 RTC_WAKEUP 类型,如果设备处于睡眠状态,它甚至会被发送。
然后只需为意图注册一个广播接收器并执行您必须执行的操作即可。
请注意,广播接收器在大约之后超时。 10 秒,所以如果你有一个很长的任务,请使用服务
You can use the AlarmManager to broadcast a pending intent at a set interval. If you use the RTC_WAKEUP type, it will even get sent if the device is asleep.
Then simply register a broadcast receiver for the intent and do what you must do.
Note that broadcast receivers timeout after aprox. 10 sec, so if you got a long task, use a service