2011-11-13 82 views
5

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

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

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

除了我的服务被破坏。当活动A被销毁时,它解除与服务的绑定。 Android看到没有更多的客户,并杀死该服务。当活动A'被创建时,服务被再次创建,并且我失去了旧服务所具有的一切。

我能看到的唯一解决方案是使用单例服务。然后它不一定是一个Android服务,只是一个每个人都可以访问的实例。 Android在这个问题上皱起了眉头吗?有没有更适合这个问题的设计?


Editted:即使我打电话startService,然后绑定到它,没有什么保证了服务实例会只要在应用程序运行存在。如果资源不足,Android可以杀死粘性服务。杀死服务会导致应用程序发生故障,而我不能这样做。

回答

7

即使我打电话startService,然后绑定到它,没有什么保证服务实例会只要应用程序正在运行就存在。

正确。

如果资源不足,Android可以杀死粘性服务。

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

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

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

我能看到的唯一的解决办法是使用该服务的单。然后它不一定是一个Android服务,只是一个每个人都可以访问的实例。 Android在这个问题上皱起了眉头吗?

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

+0

谢谢,Commonware。组件(缺少更好的单词)我只需要在应用程序启动并运行时运行,并且用户正在使用它。一旦用户关闭应用程序,该组件也可以关闭,因为其唯一目的是协调过程中异步UI相关的任务。 我确实需要定期检查服务器更新的服务(我还没有决定使用C2DM)。我将把它作为一个短期的服务来实现,在投票后关闭。 – zmbq

0

哟必须创建持久的服务。请参阅this manual

简而言之 - 不要拨打bindService,请拨打startService