优化Android上运行的服务的方法有哪些?

4
我想知道在编程方面,有什么方法可以减少服务对设备的占用?你是否有任何特殊技巧来编写服务以使其不占用太多系统内存?我认为低内存占用是我的主要关注点,这样用户就不会关闭服务并愿意一直运行它。
***编辑***
好的,看了答案后,我认为我可能做错了。我正在使用AlarmManager定期唤醒服务,但除非用户通过主活动指示,否则我永远不会停止服务。所以在我的onStartCommand执行完所需操作后,我应该调用stopService吗?stopService是否会调用onDestroy,因为如果是的话,我将在onDestroy中注销我的AlarmManager。
目前的运行方式是,当我查看手机上正在运行的服务时,服务正在运行,但实际上它什么也没有做,直到AlarmManager触发,然后它执行它的小功能,然后就结束了。

它需要一直运行吗?您可以使用AlarmManager或监听Broadcast,仅在必要时启动服务吗?您的服务是用来做什么的? - likebobby
很少有情况需要“始终运行”的服务,这甚至不好笑。服务要么是任务,如@alextsc所示,要么是用户为前台事物(例如音乐播放器)启动和停止的东西。除非您能说服我们,您的服务需要“始终运行”的明确技术原因,否则建议您避免使用它。 - CommonsWare
我编辑了我的原始问题,以回应到目前为止的评论和答案。 - ihtkwot
还有,难道不是有一些针对Android的“持续”运行的服务吗? - ihtkwot
2个回答

2
我认为低内存占用是我最关注的问题,这样用户就不想关闭服务并且愿意让其一直运行。
优化方面有一个重要的因素。Android的服务并不像Windows服务或Unix守护进程那样需要一直运行,它们更像是任务解决器,例如下载一个文件。在完成任务后,它们应该调用Service.stopSelf()来停止自身。如果您的应用程序再次需要该服务,则应为适当的任务重新启动它。

我编辑了我的原始问题,以回应到目前为止的评论和答案。 - ihtkwot
回复编辑:嘿,基本上你所做的是正确的方向。通过AlarmManager定期启动服务是可以的。在服务完成任务后,您应该在onStartCommand()内调用stopSelf()。这将调用onDestroy(),在那里您只需进行一些清理(如果需要)。如果用户应该能够像您描述的那样禁用服务的定期启动,则只需在用户单击相关控件(例如按钮)时从AlarmManager中删除挂起的Intent即可。 - user658042
好的,当我调用stopSelf时,我是否想要销毁我设置的AlarmManager通知?因此,基本上只有在用户表示不再对服务被唤醒感兴趣时,才会从AlarmManager中删除pendingWebsiteIntent。否则,在onStartCommand结束后,我将只调用stopSelf而不取消Alarm? - ihtkwot
通常情况下,您不希望在服务内部取消待处理意图(Pending Intent)。您只需停止服务即可。服务应该再次唤醒还是不应该唤醒应该由外部处理。我不知道您究竟想做什么。例如:如果您每隔几分钟检查一次邮件,则希望按照一定的频率调用您的服务。只有当用户明确在应用程序中禁用其邮件帐户时(即在服务之外),您才需要禁用待处理意图。 - user658042
好的,我认为我的问题在于我一直在我的服务内创建以下内容:AlarmManager、NotificationManager和PendingIntent。我应该在我的主活动中创建AlarmManager,然后可以在用户命令下在活动中销毁它,并在服务类中保留其他内容并执行我的检查等操作。 - ihtkwot

2
这取决于你的服务在做什么,所以没有正确或错误的答案。重要的是要注意不要让服务保持运行时间超过必要的时间。如果你的服务大部分时间处于空闲状态,可以考虑使用定时器周期性唤醒它,并在周期性工作完成后停止服务。这样做还有一个好处,就是防止许多任务管理器在服务运行时间很短的情况下销毁它。
我也尽量使用非精确定时器,因为它们通常对电池更加友好,而电池寿命也是需要注意的。
在内存占用方面,无论是在服务、活动、接收器或其他任何地方,释放任何未使用的资源并使代码尽可能简洁高效都是值得的。虽然当前智能手机的内存比功能手机多得多,但Android越来越多地在相对较低规格的硬件上运行,因此需要注意低端设备。
Reto Meier最近在他的博客上撰写了一些涵盖这些主题的文章。

我编辑了我的原始问题,以回应到目前为止的评论和答案。 - ihtkwot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接