Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/388.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 后台进程,定期扫描用户的位置,并在应用程序未打开时更新本地数据库_Java_Android_Service_Background Process_Intentservice - Fatal编程技术网

Java 后台进程,定期扫描用户的位置,并在应用程序未打开时更新本地数据库

Java 后台进程,定期扫描用户的位置,并在应用程序未打开时更新本地数据库,java,android,service,background-process,intentservice,Java,Android,Service,Background Process,Intentservice,我正在创建一个应用程序,每半小时检查一次用户位置,并更新本地数据库中用户的位置,然后根据用户的位置运行CRUD查询,即使应用程序未运行。我该怎么做 我已经参考了这篇文章,但我仍然不知道哪种方法是正确的 根据文章,我有4个选择来实现我的目标 1) 服务人员:但由于我觉得这将是一个长期的本地数据库操作,我觉得我应该忽略这一个 2) IntentService:这不能执行多个任务,因此我觉得我也应该避免执行这项任务,因为我必须获得用户的位置并扫描数据库,更新数据库(3个任务) 3) 线程:我不知道在应

我正在创建一个应用程序,每半小时检查一次用户位置,并更新本地数据库中用户的位置,然后根据用户的位置运行CRUD查询,即使应用程序未运行。我该怎么做

我已经参考了这篇文章,但我仍然不知道哪种方法是正确的

根据文章,我有4个选择来实现我的目标

1) 服务人员:但由于我觉得这将是一个长期的本地数据库操作,我觉得我应该忽略这一个

2) IntentService:这不能执行多个任务,因此我觉得我也应该避免执行这项任务,因为我必须获得用户的位置并扫描数据库,更新数据库(3个任务)

3) 线程:我不知道在应用程序未打开时如何调用此函数

4) AsyncTask:我不确定在应用程序未打开时如何调用此函数

基本上,我希望在处理位置数据的同时,在本地数据库上运行CRON作业

如果你能把我和一些教程联系起来,并用一个简单的例子回答,让我了解所有4种方法的区别,那就太好了

//3月16日编辑: 我读过一些关于API21中引入的JobScheduler的文章,但不确定它是否也支持till Gingerbread,这是解决我问题的正确方法吗


Thanx

1.我认为对于这个需求,线程及其内部的异步任务——这个结构将非常有用

在您提供的链接中,它被很好地提到

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解决方案,也请告诉我,但我因为是个电池杀手而放弃了它


希望有帮助。

你能帮我做这个吗