【问题标题】:Long running Android 'service'长期运行的安卓“服务”
【发布时间】:2011-11-13 18:31:12
【问题描述】:

我有一个 Android 应用程序,在该应用程序中,Activity 会触发在后台运行的长时间运行的操作。这些操作在完成后与活动交互。我正在开发一个处理 Activity/Long-Running-Task 耦合的组件,负责处理被销毁和重新创建的活动。

现在该组件被实现为 Android 服务。活动调用 bindService 并使用生成的 IBinder 来启动和跟踪任务。我决定不使用 startService,因为我更喜欢通过 Java 接口实现的更丰富的 API。

现在的问题。 Activity A 启动,绑定到服务并调用 serviceApi.runTask(...)。 Activity A 然后被销毁(例如,因为用户翻转手机)并重新创建为 Activity A'。 A' 然后再次绑定到服务,宣布它的存在并且一切都应该运行良好。

除非我的服务被破坏。当 Activity A 被销毁时,它与服务解除绑定。 Android 看到没有更多的客户端,并终止了该服务。创建 Activity A' 时,会再次创建服务,而我失去了旧服务的所有内容。

我能看到的唯一解决方案是对服务使用单例。然后它不一定是 Android 服务,只是每个人都可以访问的实例。这在Android中是不受欢迎的吗?有没有更好的设计来解决这个问题?


已编辑:即使我调用 startService 然后绑定到它,也不能保证只要应用程序正在运行,服务实例就会存在。如果资源不足,Android 可以终止粘性服务。杀死服务会导致应用程序发生故障,我不能这样做。

【问题讨论】:

    标签: android multithreading service


    【解决方案1】:

    即使我调用 startService 然后绑定到它,也不能保证只要应用程序正在运行,服务实例就会存在。

    正确。

    如果资源不足,Android 可以终止粘性服务。

    也正确。所有“粘性”意味着Android可能会重新启动服务。

    杀死服务会导致应用程序出现故障,我不能这样。

    不可能创建保证永远运行的服务。对于初学者来说,用户可以随时摆脱您的服务,因为用户讨厌那些拥有永远运行的毫无意义的服务的开发人员。只有在极少数情况下才需要编写永久服务;否则,这只是草率的编程。

    我能看到的唯一解决方案是对服务使用单例。然后它不一定是 Android 服务,只是每个人都可以访问的实例。这在 Android 中是不被允许的吗?

    当进程终止时,单例(又名静态数据成员)将消失。该进程最终将被终止,特别是如果没有活动的服务并且您的任何活动都没有在前台..

    【讨论】:

    • 谢谢,Commonware。我所拥有的组件(因为没有更好的词)只需要在应用程序进程启动并运行并且用户正在使用它时运行。一旦用户关闭应用程序,组件也可以关闭,因为它的唯一目的是协调进程中与 UI 相关的异步任务。我确实需要一个定期检查服务器更新的服务(我还没有决定使用 C2DM)。我将把它实现为一个在轮询后关闭的短期服务。
    【解决方案2】:

    调用 startService 并在 onStartCommand 中返回 START_STICKY。它应该让服务继续运行。

    您可能还想研究前台服务:

    http://developer.android.com/reference/android/app/Service.html#startForeground(int, android.app.Notification)

    【讨论】:

    • 我做了同样的事情,但是当应用程序在后台终止时无法正常工作?
    【解决方案3】:

    你必须创建持久服务。参考this manual

    简而言之 - 不要打电话给bindService,打电话给startService

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多