2011-04-07 97 views
8

我目前正在将一些运动检测功能构建到我的应用程序中。我还没有找到一种方法来持续监控加速度计,而不必始终保持手机的清醒状态。在试图克服这一点时,我目前有一个实现SensorEventListener的服务。我可以每隔一段时间启动一次服务(使用报警管理器),从设备加速度计读取数据,确定设备是否正在移动,然后关闭服务。通常,这显示如下:运行多个服务

public class MyService extends Service implements SensorEventListener { 

    @Override 
    public void onCreate() { 
     super.onCreate(); 
    } 

    @Override 
    public int onStartCommand(Intent intent, int flags, int startId) { 
     super.onStartCommand(intent, flags, startId); 
       /* Register this SensorEventListener with Android sensor service */ 
     return START_STICKY; 
    } 

    @Override 
    public IBinder onBind(Intent intent) { 
     return null; 
    } 

    @Override 
    public void onDestroy() { 
     /* Unregister SensorEventListener */ 
     } 

    /* SensorEventListener Implementation ************************/ 

    @Override 
    public void onAccuracyChanged(Sensor sensor, int accuracy) {} 

    /* Receives callback when sensor values change */ 
    @Override 
    public void onSensorChanged(SensorEvent event) { 
     /* Determine if moving & then call stopSelf() to shut service down */ 
    } 
} 

我还有一个问题,但是,因为我的应用程序有另一个服务调用不同的计划。据我所知,这两个服务将在同一个线程中运行,这是不好的,因为它们可能会发生冲突。

我需要知道是否有安全的方式在同一个应用程序内同时运行多个服务。我考虑过使用IntentService而不是标准的Service类。我知道这些实现他们自己的工作线程来处理调用。问题在于我不知道如何从IntentService中实现SensorEventListener所需的异步回调类型。换句话说,我不能保证像onSensorChanged这样的方法会在IntentService完成其工作并关闭之前收到回调。

有关解决此问题的任何建议都非常感谢。

+0

您应该将Commons的答案标记为正确答案。 :) – accordionfolder 2012-03-14 18:56:57

回答

8

因为它们可能会发生冲突。

怎么样?

我需要知道,如果有在同一应用程序

有一个在中相同的应用程序同时有多个服务没有内在的问题,同时运行多个服务以安全的方式,不仅仅是在同一个应用程序中有多个活动存在内在问题。

有关解决此问题的任何建议都非常感谢。

您还没有演示过问题。

+0

@CommonsWare,感谢您花时间回答。事后看来,我的问题很糟糕,让我换个口吻。如果我调用两个单独的服务(按不同的时间表),是不是都默认在主应用程序(UI)线程中启动?如果这些服务的调用发生重叠,会有什么后果(如果有)?这两个服务是否会在没有任何严重后果的情况下(按照未指定的顺序)完成他们的工作? – user522210 2011-04-07 17:42:17

+0

我的理解是,由于这两个服务都将在主线程上运行,因此第一个触发的服务将运行,而下一个服务将被放到主线程的消息队列中,并在稍后处理。另外,如果第一个服务占用太长时间,则可能会抛出ANR。 (我不确定这一点,但BroadcastReceiver的文档说,如果接收器在10秒内没有完成,ANR将被抛出。) – advantej 2011-04-07 18:30:34

+0

@advantej谢谢你的解释。我的BroadcastReceiver(响应由AlarmManager触发的意图)执行的唯一工作是启动服务,因此接收方的工作应在指定服务启动后完成。这消除了你提到的ANR场景,对吧? – user522210 2011-04-07 19:32:50