到目前为止,我创建了一个应用程序,能够扫描Wifi接入点,并在检测到不同连接时获取结果。我正在使用广播接收器在主活动中完成这个过程。该应用程序也能够将数据发送到服务器。
现在我想将此过程移至后台的定期处理,即使智能手机处于睡眠模式下也可以。
我已经阅读了一些关于如何做到这一点的主题,但没有一个是清晰的。我的问题是什么是最好的方法来做到这一点?使用带有计时器/计时器任务的服务/IntentService?
谢谢。
编辑:感谢!!AlarmManager和Services工作得很好!
AlarmManager
可以满足您的需求,使用 setRepeating
设置某个任务每隔 X 时间重复执行。参数
type ELAPSED_REALTIME、ELAPSED_REALTIME_WAKEUP、RTC或RTC_WAKEUP之一。
triggerAtMillis 以毫秒为单位的时间,该警报应首先响起,使用适当的时钟(取决于警报类型)。
intervalMillis 警报重复之间的毫秒间隔。
operation 警报响起时要执行的操作;通常来自IntentSender.getBroadcast()。
正如注释所说
注意:从API 19开始,所有重复警报都不精确。如果您的应用程序需要精确的传递时间,则必须使用一次性精确警报,每次按上述描述重新安排。目标SdkVersion早于API 19的旧版应用程序将继续将其所有警报(包括重复警报)视为精确。
但我认为如果不精确,你可能不太在意。
或者您可以使用 setInexactRepeating
参数
type 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、Wake lock并将RTC_WAKEUP用作AlarmManager类型。
RTC_WAKEUP: 在System.currentTimeMillis()(UTC中的壁钟时间)中的闹钟时间, 将在其响起时唤醒设备。