我有一个名为MainActivity的Activity,它启动一个名为MainService的服务。它还绑定了Service,因此MainActivity可以访问MainService中的方法和公共变量。是否有可能以相反的方式进行,即服务能够访问活动的方法?
我希望以这种方式实现它,因为我在onAesume()上设置了MainActivity中的变量,并且在第一次启动时,onResume()运行时服务尚未启动,所以在那个时间点服务仍然是空的。
答案 0 :(得分:1)
此答案假定相关服务在不同的流程中运行:
是的,有可能。一般的想法是,不仅您的Activity
通过某个AIDL定义的接口绑定远程Service
,而且它还实现Service
知道的额外AIDL接口,并将其自身设置为远程Service
的回调目标。
您必须拥有2个AIDL文件:第一个描述Service
的界面,第二个描述Activity
的界面。
这种方案的实施非常类似于"远程服务回调"在this answer中描述,虽然"回调"方法不再是void
,而是返回您感兴趣的值。
设计注意事项:
上述方案允许您从Activity
获取值,但我认为您不应该采用这条路径。从您的用例说明看,您只希望在Service
恢复时将一些值传递给Activity
。由于您的Service
仍然受到约束,因此您只需将方法setSomeValue(int value)
添加到其AIDL定义中,然后从onServiceConnected()
回调中调用此方法。
答案 1 :(得分:0)
是的,这是可能的。 您必须在服务中准备方法,以便在服务绑定后返回您的活动:
public void bindActivity(MyActivity activity){...}
然后,在将服务绑定到activity之后,只需使用MyActivity.this
作为参数调用此方法。
<强>然而... 强>
你可能不应该这样做。更明确的解决方案是使用LocalBroadcastManager传递事件和数据,或使用一些更高效的解决方案(如Otto)来做同样的事情,但仍然 - 不能直接访问另一个组件的字段/方法。