2014-04-02 39 views
4

我已经开始了大约一两个月的时间,并且我已经开发了基于Wifi指纹识别的室内定位系统。我需要一个定期扫描wifi AP并将结果数据发送到服务器的应用程序。Android中的背景无线扫描

到目前为止,我创建了一个应用程序,它能够扫描wifi AP并在检测到不同连接时获得结果。我正在使用广播接收器进行主要活动。该应用程序也能够将数据发送到服务器。

我现在想要的是将此过程在后台移至周期性过程,即使智能手机处于睡眠模式。

我已经阅读了一些关于如何做的话题,但没有一个是清楚的。我的问题是做这件事的最好方法是什么?通过Timer/TimerTask使用Service/IntentService?

谢谢。

编辑:谢谢!! AlarmManager和服务工作正常!

+1

目前的答案并不告诉你,你还需要一个唤醒锁来让你的代码在电话睡着时运行。 –

+0

好点,我编辑了我的答案。还有“_WAKEUP”版本的警报值得一提。 –

+0

谢谢!我会尽力实施它.. – Sagat

回答

3

我想到一个AlarmManager适合您的需求,使用setRepeating设置一些重复每X时间

预约重复报警。注意:对于定时操作(ticks, 超时等),使用Handler更容易和更高效。如果 已经为同一个IntentSender安排了一个闹钟,它将首先取消 。

与set(int,long,PendingIntent)类似,除了您还可以提供一个报警自动重复的时间段 。这个报警 继续重复,直到明确删除 取消(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 LockWake lock并使用RTC_WAKEUP作为AlarmManager类型。

RTC_WAKEUP:在System.currentTimeMillis的 报警时间()(以UTC挂钟时间), 当它熄灭,这将唤醒设备。

0

将您的代码从活动转移到服务。然后,使用AlarmManager定期启动服务。服务完成扫描并在完成后停止自我。然后当计时器消逝时再次启动。

编辑:也看看cpu lockwifi lock

EDIT2:同样当创建闹钟时,请使用RTC_WAKEUP常数,以便即使设备处于睡眠模式也会触发您的操作。