【问题标题】:Sleeping service with contentobserver使用 contentobserver 的睡眠服务
【发布时间】:2011-11-02 12:55:14
【问题描述】:

我创建了一个托管 ContentObserver (C) 的服务 (S)。 C 跟踪一些数据并记录对数据库所做的更改 (D)。

S 还有一个计时器,它可以定时将 D 的内容转储到文件中。

我的服务在我的手机上运行,​​一段时间内一切正常(几个小时左右)。然后突然停止记录对数据所做的更改并停止转储到文件。 我尝试更改数据(在 C 上引发 onChange)并在手机中四处浏览以保持设备处于唤醒状态,但什么也没发生 - 服务仍然处于非活动状态。 S 仍在运行,当我连接到我的笔记本电脑时,我在日志中看不到任何错误。

我的猜测是服务正在休眠(没有 CPU 片)。我读过一些关于唤醒锁的文章,但我不想强迫手机一直处于唤醒状态。 ()。 另一种方法是创建一个重复警报,每 T 分钟执行一次 C 的工作(轮询)。 我更喜欢 ContentObservers 的想法,因为用户可以在更新之间更改(尤其是删除)数据。使用 ContentObserver,我将获得所有更改,而不仅仅是定时间隔的快照。

关于如何定期唤醒我的服务有什么想法吗?

最好的问候 弗雷德里克

【问题讨论】:

    标签: android service wakelock contentobserver


    【解决方案1】:

    您可以使用 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);
    

    然后只需为意图注册一个广播接收器并执行您必须执行的操作。 请注意,广播接收器在 aprox 之后超时。 10 秒,所以如果您的任务很长,请使用服务

    【讨论】:

    • 嗨,埃里克。该应用程序已经服务(如我的问题所述)。我的问题是该服务进入休眠状态,因此停止监视数据。我试图用相应的接收器注册警报。接收者然后有意图地调用服务。就没有其他办法了吗?
    • @Frederik Di 你得到的答案是“我的问题是这个服务睡着了因此停止监视数据。我试图向相应的接收器注册一个警报。然后接收器用一个意图。没有其他方法可以解决这个问题吗?”。
    • @becomputer06 不,我没有得到任何答案。我的解决方法是按照您的建议创建警报。我问这个问题已经有一段时间了,我希望更新的 API 能够满足这个需求。
    猜你喜欢
    • 2014-07-25
    • 1970-01-01
    • 2011-01-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多