【问题标题】:Android - using background serviceAndroid - 使用后台服务
【发布时间】:2009-10-27 05:06:19
【问题描述】:

我有一个混合大小写 IDL 服务,我以两种方式使用它:

  1. 该服务将生成一个线程并进行网络调用以代表 Activity 获取一些 XML 内容。内容通过定义回调方法的客户端IDL返回给Activity
  2. 如果用户选择通知选项,则服务会创建一个重复执行的计时器并创建一个工具栏通知。它还缓存了内容,因此当 Activity 请求更新时,它是从缓存中提供的,而不是另一个网络调用

所以我的问题是

  1. 对于场景 #1,我为使用网络调用服务而不是直接在 Activity 中创建后台线程支付的价格是多少(如果有)?
  2. 对于 #2 - 我最好将实现更改为 AlarmManager 吗?我注意到,当我使用 TasKiller 杀死进程时,我的服务会死掉并且永远不会重新启动,AlarmManager-base 作业是否有更好的恢复机会?

【问题讨论】:

    标签: android service background-process


    【解决方案1】:

    对于场景 #1,价格是多少(如果 任何)我为使用服务付费 网络调用而不是创建 后台线程直接在 活动?

    我假设,既然你说这是一个“IDL 服务”,这就是我所说的远程服务——你正在使用 AIDL 来定义一个跨进程边界使用的接口。

    在这种情况下,第二个进程的成本是几 MB 的 RAM,加上 IPC 开销的一些 CPU 时间。 “一点 CPU 时间”的多少取决于它被调用的频率。

    对于 #2 - 我是不是最好改变 AlarmManager 的实现?

    一般来说,是的。理想情况下,服务在内存中的内存越少越好。

    我注意到当我杀死进程时 有了 TasKiller,我的服务就消失了 永远不会重新启动,会 AlarmManager-base 工作有更好的 恢复的机会?

    不,因为“任务杀手”应用程序倾向于滥用 API(用 Dianne Hackborn 的话来说),这会杀死一切,包括预定的警报。目前,据我所知,没有可靠有效的防御“任务杀手”的方法。

    【讨论】:

    • 对 AIDL 是的。我了解实际调用时的费用,我真的没有选择在单独的线程上进行,因为它是一个可能需要很长时间才能完成的网络调用。但是在调用之间呢?长时间让此类服务无所作为是否有任何惩罚。假设我没有通知并且根本不需要定义 Timer 但仍然使用该服务来服务远程呼叫。这是合法的吗?
    • 当然,尤其是当您在客户端使用 BIND_AUTO_CREATE 时。然后,Android 会在没有绑定客户端后的某个时间关闭远程服务。同样,理想情况下,您希望避免服务一直在内存中徘徊,仅从内存消耗的角度来看。
    • 我会借此机会让您厌烦一点:我是否应该重构我的代码,在其中我以两种方式使用 AIDL 公开的服务 1. 代表客户端从网络获取 XML需求 2. 定期检查更新,通知并缓存结果它在我的 MyTouch 上运行得非常快,但如果可以的话,我想优化它
    • 这种优化,如果我理解你想要做的正确的话,不一定会帮助你的个人应用程序的性能,但它会使它在设备上成为一个更好的播放器。可以这么说,“死服务不使用电池”。因此,如果您的重构意味着您的服务内存不足,除非它正在做有意义的工作,并且您的轮询周期是合理的(例如,10 分钟),那么重构可能是一个好主意。
    • 我只是无法接受使用名称中带有“警报”的东西来进行常规计划操作。基本上,如果我没看错的话 - 服务实施得很差,即使以“黑客”你的代码为代价也应该避免。它只是将 AlertManager 用于 cron op 对我来说就像是一种黑客攻击。我错了吗? AIDL 服务是否有合法(推荐)的场景?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-13
    • 1970-01-01
    • 1970-01-01
    • 2011-09-15
    • 2020-06-05
    • 1970-01-01
    相关资源
    最近更新 更多