2011-11-02 104 views
1

我已经创建了一个服务(S),它承载一个ContentObserver(C)。 C跟踪一些数据并记录对数据库所做的更改(D)。睡眠服务与内容服务器

S还有一个定时器,它将D的内容按定时间隔转储到文件中。

我有我的服务在我的手机上运行,​​一段时间(一两个小时左右)似乎都很好。然后突然停止记录对数据所做的更改并停止将其转储到文件。 我试着改变数据(在C上挑起onChange)并在手机中浏览以保持设备清醒,但没有发生任何事 - 服务stil不活动。 S仍在运行,当我连接到我的笔记本电脑时,我在日志中看到没有错误。

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

关于如何在常规基础上唤醒我的服务的任何想法?

问候 弗雷德里克

回答

0

可以使用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秒,所以如果你有一个长期的任务,使用服务

+0

嗨埃里克。该应用程序已经是服务(如我的问题所述)。我的问题是,这项服务睡着了,因此停止监测数据。我试图用相应的接收器注册一个闹钟。接收者然后以意图呼叫该服务。有没有其他解决方法呢? – Frederik

+0

@Frederik Di你得到的回答是“我的问题是这个服务睡着了,因此停止监视数据,我试图用相应的接收器注册一个警报,然后接收者打算用意图调用服务。在这附近?“。 – dira

+0

@ becomputer06不,我没有得到任何答案。正如你所建议的那样,我的解决方法是创建一个警报。自从我问这个问题已经有一段时间了,我希望更新的API能够适应这种需求。 – Frederik