我应该为我的Android应用程序使用Service或IntentService吗?

时间:2014-02-26 08:27:31

标签: android android-service android-intentservice

请纠正我如果我错了:

1) 服务用于在后台执行长任务。服务在UI线程中运行,因此如果有长任务,那么它可能会冻结我们的UI。只要我们告诉它停止,服务将继续独立于应用程序运行。

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

我必须做什么:

1)每5秒检查一次位置

2)如果位置发生变化,请将其发送至服务器并使用新位置值更新UI

让我感到困惑的是:

我应该使用服务 IntentService ,因为我需要在5秒后连续执行此操作,并且不希望我的UI线程无响应。

此应用将用于跟踪车辆。

6 个答案:

答案 0 :(得分:3)

我不会使用IntentService因为它会在作业完成后自动完成,您需要在5秒后重新安排它。要重新安排它,您需要一个与应用程序Timer关联的复杂外部Context机制,或者更糟糕的是,使用AlarmManager会像疯了一样吮吸您的电池。

我会使用一个内置Timer的服务来调度TimerTasks每5秒,并且在每个TimerTask上,无论如何都会在工作线程上执行,我会获得该位置并进行Http请求。

请不要忘记在cancel方法上使用onDestroy计时器,否则您将泄漏Service个实例。

修改 我刚刚注意到这个and Update the UI with new location values ...继续使用Service,但要么使用AsyncTaskdoInBackground中发送请求,然后在{{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.

Location api

答案 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

    }
}

如果对您有帮助,请标记接受此答案。