请纠正我如果我错了:
1) 服务用于在后台执行长任务。服务在UI线程中运行,因此如果有长任务,那么它可能会冻结我们的UI。只要我们告诉它停止,服务将继续独立于应用程序运行。
2)另一方面, IntentService 用于在单独的线程中执行短任务。它在完成任务时自动终止。
我必须做什么:
1)每5秒检查一次位置
2)如果位置发生变化,请将其发送至服务器并使用新位置值更新UI
让我感到困惑的是:
我应该使用服务或 IntentService ,因为我需要在5秒后连续执行此操作,并且不希望我的UI线程无响应。
此应用将用于跟踪车辆。
答案 0 :(得分:3)
我不会使用IntentService
因为它会在作业完成后自动完成,您需要在5秒后重新安排它。要重新安排它,您需要一个与应用程序Timer
关联的复杂外部Context
机制,或者更糟糕的是,使用AlarmManager
会像疯了一样吮吸您的电池。
我会使用一个内置Timer
的服务来调度TimerTasks
每5秒,并且在每个TimerTask
上,无论如何都会在工作线程上执行,我会获得该位置并进行Http请求。
请不要忘记在cancel
方法上使用onDestroy
计时器,否则您将泄漏Service
个实例。
修改强>
我刚刚注意到这个and Update the UI with new location values
...继续使用Service
,但要么使用AsyncTask
在doInBackground
中发送请求,然后在{{1}中发送广播消息或者,使用相同的onPostExecute
机制,但使用通过UI Looper实例化的TimerTask
,并在该处理程序上发出UI更新请求。
答案 1 :(得分:2)
1)服务用于在后台执行长任务。服务在UI线程中运行,因此如果有长任务,那么它可能会冻结我们的UI。
是的,但是当您使用服务执行某项长任务时,您可以在其中创建线程。服务的一个非常重要的特性是,如果你的内存很少,android系统不太可能杀死你的应用程序。如果你使用setForeground,那么它将更不可能杀死你的应用程序。
只要我们告诉它停止,服务将继续独立于应用程序运行。
它将在您的应用程序进程中运行,因此您无法告诉它将独立运行,您当然可以从您的应用程序中停止它,或者服务可以在它完成其工作时自行停止。
2)另一方面,IntentService用于在单独的线程中执行短任务。它在完成任务时自动终止。
IntentService扩展了Service,使得实现Service变得更加容易,它在自己的工作线程上运行代码。如果没有更多的排队工作,它将终止。
我是否应该使用Service或IntentService,因为我需要在5秒后连续进行,并且不希望我的UI线程无响应。
它在很大程度上取决于你的任务,如果你的工作是通过某些功能从UI触发的,那么请使用IntentService。裸机服务是真正长期任务的集会,即。喜欢mp3播放器,或者你需要与服务器保持持续的通信。
如果您的应用可以在您的应用处于后台时发布,即。它是由BroadcastReceiver触发的,那么你应该研究一下wakefull intentservice:
https://github.com/commonsguy/cwac-wakeful
它会让你的应用程序保持活动状态,意图服务将处理你的工作,否则android被允许杀死你的应用程序(广播onReceive返回后)。
答案 2 :(得分:1)
您可以使用IntentService
AlarmManager
我在这个项目中做了类似的事情:
https://github.com/madhur/MapMyLocation/tree/develop/src/in/co/madhur/mapmylocation
您可以查看
答案 3 :(得分:0)
IntentService
派生自Service
,只为您创建一个线程并管理生命周期。
您应该将IntentService
与较新的Android Location Strategies结合使用。特别是如果您正在检查用户位置,您可以使用地理围栏并让操作系统为您完成工作 - 并节省电池。
答案 4 :(得分:0)
关于位置
有位置距离更新 - >即如果手机的位置变化超过X米,则发送更新,不要求每5秒钟,如果你在移动的车辆中,X米将快速通过,如果你走路,你将永远不会移动超过5秒超过3-5米 - 人们会抱怨你的应用程序杀死他们的电池
此外 - 服务只会在您的应用未运行时继续运行,如果您开始粘贴。否则,当您的应用程序从应用程序队列中销毁时,服务也是如此。
requestLocationUpdates(long minTime, float minDistance, Criteria criteria, PendingIntent intent)
Register for location updates using a Criteria and pending intent.
void requestLocationUpdates(long minTime, float minDistance, Criteria criteria, LocationListener listener, Looper looper)
Register for location updates using a Criteria, and a callback on the specified looper thread.
void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener)
Register for location updates using the named provider, and a pending intent.
void requestLocationUpdates(String provider, long minTime, float minDistance, LocationListener listener, Looper looper)
Register for location updates using the named provider, and a callback on the specified looper thread.
void requestLocationUpdates(String provider, long minTime, float minDistance, PendingIntent intent)
Register for location updates using the named provider, and a pending intent.
答案 5 :(得分:0)
如果您不想使用任何服务,则可以使用location API的功能。您必须注册您的位置经理,提供最新的位置。如果您需要使用
之一的服务 IntentService
是您的最佳选择。
locationManager.requestLocationUpdates(provider,
5000 ,
10, new myLocationListener());
这是您的位置监听器类。
public class myLocationListener implements LocationListener{
@Override
public void onLocationChanged(Location location) {
// Here you can get latest location and update to server
//location object provides you to latest location.
}
@Override
public void onProviderDisabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onProviderEnabled(String provider) {
// TODO Auto-generated method stub
}
@Override
public void onStatusChanged(String provider, int status, Bundle extras) {
// TODO Auto-generated method stub
}
}
如果对您有帮助,请标记接受此答案。