我正在尝试确定绑定服务是否适用于我的应用程序中的后台工作。要求是各种应用程序组件可以通过它进行不同优先级的Web请求。(因此,服务必须维护某种队列,并能够取消其正在进行的请求以执行更高优先级的其他请求)。我希望该服务对用户相对不会显眼,以便在完成应用程序后他们不会发现它正在运行 - 如果我想做一些在应用程序关闭后仍然持续的更重要的事情,我可以使用startForeground()在过程中推送通知。
解决方案1:从活动中绑定
因此,对于给定的应用程序组件,它应该能够绑定到服务来完成工作。但是,似乎有一个众所周知的问题,即如果活动正在进行绑定,则在配置更改(旋转)期间将丢失绑定,因为该活动将被关闭。
因此,我想我可以使用另一个上下文(new Context()
)并从其绑定到服务,然后使用非UI片段在配置更改期间维护此上下文,直到我认为我已经完成了相关工作。我只能在配置更改期间或作为从活动进行绑定的永久替代方案来执行此操作。(我应该指出,这是一种标准且推荐的维护实例的方法。跨配置更改)
解决方案2:
我看到的主要选择是,我可以使用应用程序上下文来执行绑定 - 但这可能会持续太久吗?和/或是否可能存在应用程序上下文和服务之间的某些循环关系,从而阻止服务和应用程序上下文被销毁?
问题:
因此,我试图回答自己的问题是:我应该使用第一种方法(具有临时上下文的活动)?还是第二种方法(只需将服务绑定到应用程序上下文)?
我是否正确地认为应用程序上下文可以多次绑定到服务,然后取消相同数量的绑定?(即,每个上下文可以有多个有效绑定)?
在第一种解决方案中使用自己的上下文(new Context()
)是否可能会导致任何问题?
编辑
找到了更多信息:https://groups.google.com/forum/#!topic/android-developers/Nb58dOQ8Xfw
似乎很难“创建”一个任意的上下文,因此方案1和2的组合似乎是合适的,其中服务连接在配置更改时保持不变,但绑定到应用程序上下文。 我仍然担心可能从应用程序上下文中取消绑定两次的可能性。 自己保留绑定计数似乎是不必要的 - 有人可以确认/否认绑定是每个连接而不是每个上下文吗?
service
同时设置为started
和bound
。那么,unbind
不会销毁该service
(当它自行决定工作已完成且没有活动绑定到它时,service
本身将负责调用stopSelf
)。 - Tomasz Gawel