Sag*_*gat 5 service android background-process android-wifi
我已经开始大约一两个月了,我必须开发一个基于 Wifi 指纹识别的室内定位系统。我需要一个定期扫描 wifi AP 并将结果数据发送到服务器的应用程序。
到目前为止,我创建了一个应用程序,它能够扫描 WiFi AP 并在检测到不同连接时获取结果。我在主要活动中使用广播接收器执行此操作。该应用程序还能够将数据发送到服务器。
我现在想要的是将这个过程移至后台的定期过程,即使智能手机处于睡眠模式时也是如此。
我已经阅读了一些有关如何执行此操作的主题,但没有一个是明确的。我的问题是最好的方法是什么?将 Service/IntentService 与 Timer/TimerTask 一起使用?
谢谢。
编辑:谢谢!!AlarmManager 和服务工作正常!
我认为 anAlarmManager适合您的需求,用于setRepeating设置每 X 次重复的内容
安排重复闹钟。注意:对于计时操作(滴答声、超时等),使用 Handler 更容易、更高效。如果已经有为同一个 IntentSender 安排的警报,它将首先被取消。
与 set(int, long, PendingIntent) 类似,但您还可以提供闹钟自动重复的时间段。此警报会继续重复,直到使用 cancel(PendingIntent) 明确删除为止。如果指定的触发时间已过去,则将立即触发警报,警报计数取决于触发时间相对于重复间隔的过去时间。
如果警报被延迟(例如,对于非 _WAKEUP 警报类型,由于系统睡眠),将尽快传递跳过的重复。之后,以后的警报将按照原计划发送;它们不会随着时间的推移而漂移。例如,如果您设置了每小时整点的重复闹钟,但手机在 7:45 至 8:45 期间处于睡眠状态,则手机一醒来就会发送闹钟,然后下一次闹钟将在9:00。
如果您的应用程序希望允许传递时间漂移,以保证警报之间始终至少经过一定的时间间隔,那么要采取的方法是使用一次性警报,在处理每个警报传递时自行安排下一个警报。
注意:从 API 19 开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并如上所述重新安排每次时间。targetSdkVersion 早于 API 19 的旧应用程序将继续将其所有警报(包括重复警报)视为准确警报。
参数
类型ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC 或 RTC_WAKEUP 之一。
triggerAtMillis 是警报首次响起的时间(以毫秒为单位),使用适当的时钟(取决于警报类型)。
IntervalMillis 警报后续重复之间的时间间隔(以毫秒为单位)。
操作警报响起时执行的操作;通常来自 IntentSender.getBroadcast()。
正如注释所说
注意:从 API 19 开始,所有重复警报都不准确。如果您的应用程序需要精确的交付时间,那么它必须使用一次性精确警报,并如上所述重新安排每次时间。targetSdkVersion 早于 API 19 的旧应用程序将继续将其所有警报(包括重复警报)视为准确警报。
但我认为如果不精确的话你也不会太在意。
或者你可以使用setInexactRepeating
安排一个具有不精确触发时间要求的重复警报;例如,每小时重复一次的闹钟,但不一定在每个整点重复一次。这些警报比传统上由 setRepeating(int, long, long, PendingIntent) 提供的严格循环更节能,因为系统可以调整警报的传递时间以使其同时触发,从而避免不必要地将设备从睡眠状态唤醒。
您的警报的第一次触发不会在请求的时间之前,但在该时间之后的几乎整个时间间隔内可能不会发生。此外,虽然重复警报的总周期将按照要求,但警报的任何两次连续触发之间的时间可能会有所不同。如果您的应用程序需要非常低的抖动,请改用具有适当窗口的一次性警报;请参阅 setWindow(int, long, long, PendingIntent) 和 setExact(int, long, PendingIntent)。
从 API 19 开始,所有重复警报都是不准确的。由于此方法自 API 3 起可用,因此您的应用程序可以安全地调用它,并确保它将在当前版本和旧版本的 Android 上获得类似的行为。
参数
类型 ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC 或 RTC_WAKEUP 之一。
triggerAtMillis 是警报首次响起的时间(以毫秒为单位),使用适当的时钟(取决于警报类型)。这是不精确的:警报不会在此时间之前触发,但在第一次调用警报之前可能会有几乎整个警报间隔的延迟。
IntervalMillis 警报后续重复之间的时间间隔(以毫秒为单位)。
在 API 19 之前,如果这是 INTERVAL_FIFTEEN_MINUTES、INTERVAL_HALF_HOUR、INTERVAL_HOUR、INTERVAL_HALF_DAY 或 INTERVAL_DAY 之一,则警报将与其他警报保持相位一致,以减少唤醒次数。否则,警报将被设置,就像应用程序调用了 setRepeating(int, long, long, PendingIntent) 一样。从 API 19 开始,所有重复警报都将不准确,并且会与其他警报进行批处理,无论其规定的重复间隔如何。操作 警报响起时执行的操作;通常来自 IntentSender.getBroadcast()。
虽然我的回答目标是说每 X 次重复一个操作的一般方法,但正如其他人注意到的那样,您将需要Wifi Lock、唤醒锁并使用RTC_WAKEUP作为 AlarmManager 类型。
RTC_WAKEUP:System.currentTimeMillis() 中的闹钟时间(UTC 中的挂钟时间),当闹钟响起时会唤醒设备。
| 归档时间: |
|
| 查看次数: |
4368 次 |
| 最近记录: |