【问题标题】:What are some ways to optimize a service running on Android?有哪些方法可以优化在 Android 上运行的服务?
【发布时间】:2011-09-25 05:18:33
【问题描述】:

我想知道您可以通过哪些编程方式来最大程度地减少您的服务在设备上的占用空间?您编写服务的方式是否有任何特殊技巧,以便它不会占用太多系统内存?我想低内存占用是我主要关心的问题,因此用户不想关闭服务并愿意让它一直运行。

***编辑***

好的,所以阅读答案我认为我一定做错了。我正在使用 AlarmManager 定期唤醒服务,但除非用户通过主要活动指示,否则我不会停止服务。所以应该在我的服务执行了我应该调用 stopService 所需的操作之后,我在 onStartCommand 的末尾添加了它?不会停止服务调用 onDestroy,因为如果它停止了,我会在 onDestroy 中注销我的 AlarmManager。

当我在手机上运行服务时,它现在运行的方式是运行服务,但它实际上并没有做任何事情,直到 AlarmManager 关闭,此时它执行它的小功能,仅此而已。

【问题讨论】:

  • 它需要一直运行吗?可以只在需要的时候使用AlarmManager或者监听Broadcast来启动服务吗?你的服务是做什么的?
  • 很少有需要“始终运行”的服务的情况,这甚至都不好笑。服务要么是@alextsc 指示的任务,要么是用户为前台的东西(例如,音乐播放器)启动和停止的东西。除非您能说服我们您的服务需要“始终运行”有明确的技术原因,否则我建议您避免这样做。
  • 我编辑了我的原始问题以解决到目前为止的 cmets 和答案。
  • 另外,是不是有一些服务在 Android 上“持续”运行?

标签: java android optimization android-service


【解决方案1】:

我想低内存占用是我主要关心的问题,因此用户不想关闭服务并愿意让它一直运行。

有一个巨大的优化。 Android 服务并不意味着一直运行(如 Windows 服务或 unix 守护程序)。 他们更像是一个任务解决者,例如下载一个文件。完成任务后,他们应该调用 Service.stopSelf()。 如果您的应用再次需要该服务,则应重新启动该服务以执行相应的任务。

【讨论】:

  • 我编辑了我的原始问题以解决到目前为止的 cmets 和答案。
  • 对编辑的回应:嘿,基本上你所做的是正确的方向。通过 AlarmManager 定期启动服务很好。服务完成任务后,您应该在 onStartCommand() 中调用 stopSelf()。这将调用 onDestroy(),您可以在其中进行一些清理(如果需要)。如果用户应该能够像您描述的那样禁用服务的常规启动,只需在用户单击相关控件(例如按钮)时从 AlarmManager 中删除挂起的 Intent。
  • 好的,所以当我调用 stopSelf 时,我想销毁我设置的 AlarmManager 通知吗?所以基本上我只会在用户表示他们不再对被唤醒的服务感兴趣时从 AlarmManager 中删除 pendingWebsiteIntent?否则在 onStartCommand 结束后我只会调用 stopSelf 而不会取消警报?
  • 通常你不想杀死服务内部的待处理 Intent。您只需停止服务即可。是否应该再次唤醒服务应该在它之外处理。我不知道你到底想做什么。例如:如果您每隔几分钟检查一次邮件,您希望定期调用您的服务。当用户在应用程序中明确禁用他的邮件帐户时(=在服务之外),您只想禁用待处理的 Intent。
  • 好的,我认为我的问题是我一直在我的服务内部创建以下内容:AlarmManager、NotificationManager 和 PendingIntent。我可能应该在我的主要活动中创建 AlarmManager,然后可以在用户命令的活动中将其销毁,并将其他人留在服务类中并执行我的检查等。
【解决方案2】:

这真的取决于您的服务在做什么,所以没有正确或错误的答案。我要注意的重要一点是不要让服务保持活动的时间超过所需的时间。如果您的服务大部分时间都处于空闲状态,请考虑通过警报定期唤醒它,并在其定期工作完成后停止服务。这还有一个额外的好处,就是防止许多任务杀手在你的服务没有长时间运行时破坏它。

我也尝试使用不准确的警报,因为这些通常对电池更友好,而且电池寿命也是您应该注意的事情。

就内存占用而言,总是值得释放任何未使用的资源,并尽可能保持代码精简和平均,无论是在 Service、Activity、Receiver 中还是在任何地方别的。尽管目前的智能手机比功能手机拥有更多的内存,但 Android 越来越多地运行在相对较低规格的硬件上,因此值得关注低端设备。

Reto Meier 最近在his blog 上撰写了一些涵盖此类主题的文章。

【讨论】:

  • 我编辑了我的原始问题以解决到目前为止的 cmets 和答案。
猜你喜欢
  • 2011-10-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-11-17
  • 2020-05-25
  • 1970-01-01
  • 2018-12-30
  • 1970-01-01
相关资源
最近更新 更多