9

请纠正我如果我错了:

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

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

我必须做的:

1) 每 5 秒检查一次位置

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

让我感到困惑的是:

我应该使用Service还是IntentService,因为我需要在 5 秒后连续执行,并且不希望我的 UI 线程变得无响应。

此应用程序将用于跟踪车辆。

4

6 回答 6

3

我不会使用 an ,IntentService因为一旦工作完成,它就会自行完成,您需要在 5 秒后重新安排它。要重新安排它,您需要一些Timer与应用程序相关的复杂外部机制,Context或者更糟糕的是,使用AlarmManager它会疯狂地消耗您的电池。

我会使用一个带有Timer内部的服务来安排TimerTasks每 5 秒,并且在每个TimerTask在工作线程上执行的服务上,我都会获得位置并发出 Http 请求。

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

编辑 我刚刚注意到这一点and Update the UI with new location values......继续使用Service,但要么使用AsyncTask发送请求,doInBackground然后发送广播消息onPostExecute,要么继续使用相同的TimerTask机制,但使用通过HandlerUI Looper 实例化的 a 并发出 UI 更新请求在那个处理程序上。

于 2014-02-26T08:36:35.753 回答
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

它将使您的应用程序在 intentservice 处理您的工作时保持活动状态,否则允许 android 杀死您的应用程序(在广播 onReceive 返回后)。

于 2014-02-26T08:35:55.553 回答
1

它应该是IntentService您可以安排使用的AlarmManager

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

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

你可以检查一下

于 2014-02-26T08:31:14.333 回答
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.

位置接口

于 2014-02-26T08:38:06.063 回答
0

如果您不想使用任何服务,则可以使用位置 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

    }
}

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

于 2014-02-26T08:39:52.807 回答
0

IntentService派生自Service并且只是为您创建一个线程并管理生命周期。

您应该将 anIntentService与较新的 Android Location Strategies结合使用。特别是如果您正在检查用户位置,您可以使用地理围栏并让操作系统为您完成工作 - 并节省电池。

于 2014-02-26T08:31:42.930 回答