Java 后台进程,定期扫描用户的位置,并在应用程序未打开时更新本地数据库
我正在创建一个应用程序,每半小时检查一次用户位置,并更新本地数据库中用户的位置,然后根据用户的位置运行CRUD查询,即使应用程序未运行。我该怎么做 我已经参考了这篇文章,但我仍然不知道哪种方法是正确的 根据文章,我有4个选择来实现我的目标 1) 服务人员:但由于我觉得这将是一个长期的本地数据库操作,我觉得我应该忽略这一个 2) IntentService:这不能执行多个任务,因此我觉得我也应该避免执行这项任务,因为我必须获得用户的位置并扫描数据库,更新数据库(3个任务) 3) 线程:我不知道在应用程序未打开时如何调用此函数 4) AsyncTask:我不确定在应用程序未打开时如何调用此函数 基本上,我希望在处理位置数据的同时,在本地数据库上运行CRON作业 如果你能把我和一些教程联系起来,并用一个简单的例子回答,让我了解所有4种方法的区别,那就太好了 //3月16日编辑: 我读过一些关于API21中引入的JobScheduler的文章,但不确定它是否也支持till Gingerbread,这是解决我问题的正确方法吗Java 后台进程,定期扫描用户的位置,并在应用程序未打开时更新本地数据库,java,android,service,background-process,intentservice,Java,Android,Service,Background Process,Intentservice,我正在创建一个应用程序,每半小时检查一次用户位置,并更新本地数据库中用户的位置,然后根据用户的位置运行CRUD查询,即使应用程序未运行。我该怎么做 我已经参考了这篇文章,但我仍然不知道哪种方法是正确的 根据文章,我有4个选择来实现我的目标 1) 服务人员:但由于我觉得这将是一个长期的本地数据库操作,我觉得我应该忽略这一个 2) IntentService:这不能执行多个任务,因此我觉得我也应该避免执行这项任务,因为我必须获得用户的位置并扫描数据库,更新数据库(3个任务) 3) 线程:我不知道在应
Thanx1.我认为对于这个需求,线程及其内部的异步任务——这个结构将非常有用 在您提供的链接中,它被很好地提到 2.对于与位置相关的博客,您可以在此处查看有用的资料: (一) (二)
希望这将对您有所帮助我想您正在寻找类似的产品。这可以完全处理您的所有案件
您可以在上述实现的doWakefulWork()中执行与位置和数据库相关的工作。您考虑过使用SyncAdapter吗。最好是按固定的时间间隔安排作业,并针对电池使用情况进行优化。此外,一旦启动,它可以独立于应用程序运行。根据您的要求,我相信这最适合您的需要。你可以看看这个。这也消除了在设备重新启动时启动服务(通常使用)的情况。即使设备重新启动,您的应用程序仍将继续运行计划作业 在SyncAdapter中,您必须使用ContentProvider,因此将数据库包装在ContentProvider中。另外,最好使用游标加载程序在DB上运行长时间运行的任务。你应该读一下。这是一个访问资源的好方法。此外,您还可以定义观察者设计模式,该模式观察数据库中的更改,并在数据库中进行更改时执行任务。这也可以在应用程序本身和SyncAdapter内部使用。游标加载器最好用于数据库的后台工作。您可以使用游标加载程序和ContentProvider执行所有CRUD操作 这不能执行多个任务 是的,它可以。它只有一个线程,因此只能同时执行一个任务 我必须得到用户的位置,扫描数据库,更新数据库(3个任务) 我不知道你为什么认为这是三项任务。你不能同时做
IntentService
的更大问题是获取位置数据是异步的,而IntentService
不适合调用本身是异步的api
但是,由于我觉得这将是一个长期的本地数据库操作,我觉得我应该忽略这一个
任何服务背后的要点都是为了“长期运营”
基本上,我希望在处理位置数据的同时,在本地数据库上运行CRON作业
使用
AlarmManager
触发WakefulBroadcastReceiver
,然后触发服务
。onStartCommand()
中的服务
,派生一个后台线程(异步)检索位置并更新数据库。然后,服务
可以调用WakefulBroadcastReceiver
上的completeWakefulIntent()
,以及stopSelf()
,使用onStartCommand()
中接收到的startId
来执行此工作,并允许线程终止。如果在此期间未收到其他命令,服务将关闭。记录用户位置时,请使用带有通知的服务。只是为了创建一个道德上负责的应用程序,通知用户该应用程序正在跟踪他们。根据定义,服务在后台运行
具有
设置间隔(长)
30分钟的融合位置提供程序将获取间隔。将fastestInterval()
设置为一分钟,以便在其他应用程序使用GPS时接收GPS数据。我已经完成了您要查找的内容,包括GPS和非GPS
我作为非GPS解决方案起点的项目已经满足了您的所有需求,并且电池友好(积分应归Kenton Price):
看看它,它就像一个符咒。只要在任何设备上运行它。如果您需要任何定制帮助,请告诉我
只需编辑“TestBroadcastReceiver”中的“onReceive”方法即可更新数据库
如果你需要GPS解决方案,也请告诉我,但我因为是个电池杀手而放弃了它
希望有帮助。你能帮我做这个吗