服务按间隔运行任务;它应该是自己的过程吗?

时间:2011-07-21 22:57:45

标签: android service process

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

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

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

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

问题:

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

2 个答案:

答案 0 :(得分:3)

  

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

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

  

我认为如果其他人可以编写自己的UI,小部件和其他很酷的东西,那就太好了。   这个权利不一定是单独的过程吗?

没有。它将自动处于与“其他人”的代码分开的过程中。

  

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

您的用户可能不同意此计划。永恒的服务是用户通过“设置”应用程序攻击具有任务杀手和强制停止的开发人员的原因。

  

是否允许它之间死亡或者我应该让它在没有唤醒锁的情况下运行?

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

  

如果我的服务在两者之间死亡(必须重新打开数据库),任务会间隔运行吗?

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

  

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

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

答案 1 :(得分:0)

在我看来,可能值得将应用程序纯粹用于服务(即除了'settings'Activity之外没有其他组件)并通过Intents完成所有操作。

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

此外,您可能希望使用IntentService来处理命令,然后在完成后自行关闭。

如果不完全了解您的要求,即服务的处理方式,则很难进一步提出建议。