我有一个Android应用,其中的Activity会触发在后台运行的长时间运行操作。完成后,这些操作与活动交互。我正在开发一个处理Activity / Long-Running-Task耦合的组件,负责处理被破坏和重新创建的活动。
现在该组件已实现为Android服务。这些活动调用bindService并使用生成的IBinder来启动和跟踪任务。我决定不使用startService,因为我更喜欢通过Java接口提供更丰富的API。
现在问题。活动A启动,绑定到服务并调用serviceApi.runTask(...)。然后销毁活动A(例如,因为用户翻转电话)并重新创建为活动A'。然后'再次绑定到服务,宣布它的存在,一切都应该运行得很好。
除了我的服务被破坏。当活动A被销毁时,它将从服务中解除绑定。 Android看到没有更多的客户端,并杀死了服务。创建活动A'后,将再次创建服务,我将丢失旧服务的所有内容。
我能看到的唯一解决方案是使用单例进行服务。然后它并不一定是Android服务,只是每个人都可以访问的实例。这在Android中不受欢迎吗?是否有更好的设计适合这个问题?
编辑:即使我调用startService然后绑定它,只要应用程序正在运行,就不会保证服务实例会存在。如果资源不足,Android可以杀死粘性服务。杀死服务会导致应用程序出现故障,我无法做到这一点。
答案 0 :(得分:7)
即使我调用startService然后绑定它,只要应用程序正在运行,就不会保证服务实例会存在。
正确。
如果资源不足,Android可以杀死粘性服务。
也正确。所有"粘"意味着Android可能会重启服务。
杀死该服务会导致应用程序出现故障,我无法解决。
创建一个保证永远运行的服务是不可能的。对于初学者来说,用户可以随时摆脱您的服务,因为用户厌恶那些拥有永无止境的无意义服务的开发人员。只有极少数情况下才需要编写永久性服务;否则,它只是草率的编程。
我能看到的唯一解决方案是使用单例进行服务。然后它并不是一个真正的Android服务,只是一个每个人都可以访问的实例。这在Android中不受欢迎吗?
Singletons(例如,静态数据成员)将在流程终止时消失。该过程最终将终止,特别是如果没有活动服务且您的任何活动都不在前台......
答案 1 :(得分:1)
调用startService并在onStartCommand中返回START_STICKY。它应该保持服务。
您可能还想查看前台服务:
http://developer.android.com/reference/android/app/Service.html#startForeground(int,android.app.Notification)
答案 2 :(得分:0)
简而言之 - 请勿致电bindService
,致电startService
。