【问题标题】:Running multiple services运行多个服务
【发布时间】:2011-04-07 15:12:57
【问题描述】:

我目前正在我的应用程序中构建一些运动检测功能。我还没有找到一种在不让手机一直保持清醒的情况下持续监控加速度计的方法。为了克服这个问题,我目前有一个实现 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 完成工作并关闭之前收到回调。

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

【问题讨论】:

  • 您应该将 Commons 的答案标记为正确答案。 :)

标签: java android multithreading service


【解决方案1】:

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

怎么做?

我需要知道是否有一种安全的方法可以在同一个应用程序中同时运行多个服务

在同一个应用程序中同时拥有多个服务并没有内在问题,正如在同一个应用程序中拥有多个活动时存在内在问题一样。

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

你没有证明问题。

【讨论】:

  • @CommonsWare,感谢您抽出宝贵时间回答。事后看来,我的问题措辞不佳……让我改写一下。如果我正在调用两个单独的服务(在不同的时间表上),默认情况下它们不是都在主应用程序 (UI) 线程中启动吗?如果这些服务的调用碰巧重叠,后果是什么(如果有的话)?这两个服务是否会简单地执行它们的工作(以未指定的顺序)而不会产生任何严重后果?
  • 我不确定。但就您所做的而言,只要您不在服务中执行任何长时间的任务,似乎应该没有任何问题。
  • @advantej:“触发的第一个服务将运行,而下一个服务将被放入主线程的消息队列中,稍后将被占用”——更多的是生命周期方法——基于方法。服务#1 可能使用onCreate()onStartCommand() 调用,然后服务#2 可能使用onCreate() 调用,然后服务#1 可能得到onDestroy(),等等。
  • @FatihOzcan:“在不同线程中从 SensorManager 获取数据的服务没有用吗?” -- Service 不是 Thread。仅在需要时使用Service(即,您正试图在后台工作)。 “即使服务在同一进程中运行,它是否会不必要地昂贵?” -- Service 本身不会增加开销。这完全取决于你如何使用它。 “只用线程就够了吗?” ——我希望如此。 “你如何设置 SensorManager 在不同的线程上运行?” -- 调用带有HandlerregisterReceiver() 的版本,您可以从HandlerThread 获得它。
  • @FatihOzcan:“它更像是没有布局且有自己任务的 Activity”——并非如此。 “我的印象是你反对服务,因为它需要更多的 CPU 和 RAM”——我怀疑我曾经写过这样的东西。我反对不必要的额外进程,因为它们需要更多的 CPU 和 RAM。 Service 不是一个进程。 “使用服务只是借口,因为它有自己的周期,即使用户存在应用程序也可以运行,对吧?” -- 一般来说,是的。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-10-29
  • 2015-06-16
  • 2019-02-03
  • 2020-03-12
  • 1970-01-01
相关资源
最近更新 更多