【问题标题】:Service runs tasks on an interval; should it be its own process?服务按时间间隔运行任务;它应该是它自己的过程吗?
【发布时间】:2011-07-21 22:57:45
【问题描述】:

我正在创建一个在后台运行的服务。它执行以下操作:

  • 收集用户数据(经许可)
  • 每 X 分钟运行一次特定任务,并每 Y 分钟将此数据发送到服务器
  • 我希望其他人可以编写自己的 UI、小部件和其他很酷的东西。

目前,服务在任务运行/网络发送之间继续运行(没有唤醒锁)。

服务监听验证和运行时变化;这需要一个单独的过程。有一些方法可以解决这个问题,但它们会涉及使用 IPC(我认为这不会对性能造成很大影响)。

问题:

  • 应该允许服务在任务之间终止,还是应该让它在没有唤醒锁的情况下运行?
  • 保持活力比每分钟左右打开一个数据库更有效吗?
  • 如果我的服务不在单独的进程中,人们可以使用它吗?

【问题讨论】:

    标签: android service process


    【解决方案1】:

    出现的问题是,我的服务应该在它自己的过程中吗?

    没有。我的意思是它应该与所有其他组件在同一进程中运行。

    我认为,如果其他人可以编写自己的 UI、小部件和其他很酷的东西,那就太好了。 它不必为此在单独的过程中吗?

    没有。它将自动与“其他人”的代码处于单独的进程中。

    现在服务在任务运行/网络发送之间保持运行(虽然不保持唤醒锁),因为我认为它比每分钟左右打开数据库/进行设置更有效。

    您的用户可能不同意此计划。持久服务是用户使用“设置”应用中的任务杀手和强制停止攻击开发人员的原因。

    应该让它死掉还是应该让它在没有唤醒锁的情况下运行?

    我建议您使用IntentService(因为无论如何您都需要后台线程来进行网络 I/O)并让服务在轮询之间关闭。另外,请允许用户从您的开头段落中控制 X 和 Y 的值。

    任务间隔运行,我的服务是否应该在其间停止(必须重新打开数据库)?

    一般来说,是的。打开数据库需要很短的时间(例如,几毫秒),除非闪存很忙。为了避免用户抱怨您的服务一直在运行,这是一个很小的代价。

    如果我的服务不在单独的进程中,人们可以使用它吗?

    是的,只要您公开一些 API(AIDL、记录的 Intents 集以通过 startService() 作为命令发送等)。

    【讨论】:

    • 服务被杀死时工作线程不会死吗?我有长时间运行的任务,我希望能够在这些任务运行时处理其他事情,这就是我到目前为止还没有使用 IntentService 的原因。
    • @Nicklas A.:我不知道你在说什么。
    • 如果我从 onHandleIntent 生成一个工作线程,该线程会在服务关闭时死掉,但我很清楚......这个问题发生是因为意图服务无法同时处理多个意图。
    • @Nicklas A.:您永远不应该“从 onHandleIntent 生成工作线程”。 “出现此问题是因为意图服务无法同时处理多个意图” - 正确。欢迎您制作自己的ConcurrentIntentService 或类似的东西。无论如何,服务应该在工作完成后关闭。
    • 这将意味着更多的工作,因为当我刷新到数据库时,我目前将内存中的内容保持在一个限制范围内。让服务运行但闲置真的会产生如此大的不同吗?
    【解决方案2】:

    在我看来,将一个应用程序纯粹用于服务(即,除了“设置”活动之外没有其他组件)并通过 Intent 完成所有事情可能是值得的。

    只要清单具有使用 <intent-filter> 块注册的所有可能的 Intent,任何人都可以与其通信(您自己的应用程序以及任何第 3 方应用程序)。

    另外,您可能想要使用IntentService,它会在命令到达时对其进行处理,然后在完成时自行关闭。

    如果不完全了解您的要求,即服务正在处理的具体内容,很难提供进一步的建议。

    【讨论】:

    • 用户往往不喜欢没有活动的应用。我们在仅限应用小部件的应用中经常看到这种情况——用户抱怨应用“损坏”,因为他们在启动器中看不到它的图标。
    • @CommonsWare:实际上我同意你的观点,并且我已经编辑了我的答案以包含一个“设置”活动。我的理由是 Niklas 提到了其他人开发自己的附加组件,因此,他将与“技术”用户打交道,他们不一定认为应用程序“损坏”,因为没有启动器存在。我仍然认为极简主义的方法可以工作,但“设置”活动是有意义的。
    • 好吧,我们也有自己的用户界面
    猜你喜欢
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2016-11-16
    • 1970-01-01
    • 1970-01-01
    • 2015-08-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多