带有 contentobserver 的睡眠服务

发布于 2024-12-13 07:13:54 字数 526 浏览 1 评论 0原文

我创建了一个托管 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

又怨 2024-12-20 07:13:54

您可以使用 AlarmManager 以设定的时间间隔广播待处理的意图。如果您使用 RTC_WAKEUP 类型,如果设备处于睡眠状态,它甚至会被发送。

Intent intent = new Intent("android.intent.action.DO_SOMETHING");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*60*1000, pendingIntent);

然后只需为意图注册一个广播接收器并执行您必须执行的操作即可。
请注意,广播接收器在大约之后超时。 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.

Intent intent = new Intent("android.intent.action.DO_SOMETHING");
PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 0, intent, 0);

AlarmManager alarmManager = (AlarmManager) getSystemService(Service.ALARM_SERVICE);
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis(), 60*60*1000, pendingIntent);

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文