我应该使用服务或IntentService为我的Android应用程序?

请纠正我如果我错了:

1) 服务用于在后台执行长时间的任务。 一个服务在UI线程中运行,所以如果有一个很长的任务,那么它可能会冻结我们的用户界面。 只要我们告诉它停止,服务将继续独立于应用程序运行。

2)另一方面, IntentService用于在单独的线程中执行短任务。 它在完成任务时自动终止。

我需要做的是:

1)每5秒检查一次位置

2)如果位置发生变化,则将其发送到服务器,并用新的位置值更新UI

什么困惑我:

我应该使用一个服务IntentService,因为我需要5秒钟后继续做,不希望我的UI线程变得没有响应。

这个应用程序将用于追踪车辆。

Solutions Collecting From Web of "我应该使用服务或IntentService为我的Android应用程序?"

我不会使用IntentService因为一旦工作完成,它就完成了,并且你需要在5秒后重新安排它。 要重新安排它,你需要一个复杂的外部Timer机制与应用程序Context相关联,或者更糟糕的是,使用AlarmManager ,将疯狂吸取你的电池。

我会使用一个服务与Timer里面每5秒调度TimerTasks和每个TimerTask ,无论如何执行一个工作线程我会得到的位置,并发出一个Http请求。

只要不要忘记cancel服务的onDestroy方法的计时器,否则你会泄漏Service实例。

编辑我只注意到这一点, and Update the UI with new location values …继续使用Service ,但要么使用AsyncTaskdoInBackground发送请求,然后在doInBackground发送广播消息,要么继续使用相同的TimerTask机制,但使用一个用UI Looper实例化的Handler ,并在该处理程序上进行UI更新请求。

1)服务用于在后台执行长时间的任务。 一个服务在UI线程中运行,所以如果有一个很长的任务,那么它可能会冻结我们的用户界面。

是的,但是当你使用服务的一些长期的任务,然后你在里面创build线程。 服务的一个非常重要的特点是,如果您的应用程序的内存不足,那么android系统不太可能杀死您的应用程序。 而如果你使用setForeground,那么它将会更有可能的杀死你的应用程序。

只要我们告诉它停止,服务将继续独立于应用程序运行。

它会运行在你的应用程序过程中,所以你不能说它会自动运行,你当然可以停止从你的应用程序,或服务可以停止自己,如果它完成其工作。

2)另一方面,IntentService用于在单独的线程中执行短任务。 它在完成任务时自动终止。

IntentService扩展了Service并使实现服务变得更加简单,它在自己的工作线程上运行你的代码。 如果没有更多的排队工作,它将终止。

我应该使用一个服务或IntentService,因为我需要5秒钟后不断做,不希望我的UI线程变得没有响应。

它很大程度上取决于你的任务,如果你的工作是从一个函数的UI触发,然后与IntentService。 光秃秃的服务是真正长期的任务,即。 像MP3播放器,或者如果你需要不断与服务器通信。

如果你的任务可以在你的应用程序处于后台时发出, 它由BroadcastReceiver触发,那么你应该考虑一下wakefull intentservice:

https://github.com/commonsguy/cwac-wakeful

它会保持你的应用程序活着intentservice将处理您的工作,否则android被允许杀死您的应用程序(广播onReceive返回后)。

它应该是IntentService ,您可以使用AlarmManager进行计划

我在这个项目中做了类似的事情:

https://github.com/madhur/MapMyLocation/tree/develop/src/in/co/madhur/mapmylocation

你可以检查出来

IntentService派生自Service并为您创build一个线程并pipe理生命周期。

您应该使用IntentService结合较新的Android 位置策略 。 特别是如果您正在检查用户位置,则可以使用地理围栏并让操作系统为您完成工作 – 并节省电量。

关于位置

有一个位置距离更新 – >即,如果电话的位置改变超过X米,然后发送更新,不要问每个5秒,如果你在一个移动的车辆,X米会走得快,如果你正在走路,你将永远不会移动超过3-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. 

位置api

如果您不想使用任何服务,则可以使用位置API的function。 你必须注册你的位置经理提供最新的位置。 如果你需要使用的服务之一

  IntentService 

对你来说是最好的select。

 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 } } 

请标记接受这个答案,如果它对你有帮助。