我有一个名为MainActivity的活动,它启动了一个名为MainService的服务。它还绑定了服务,因此MainActivity可以访问MainService中的方法和公共变量。是否有可能以另一种方式做到这一点,即服务能够访问活动的方法?
我希望以这种方式实现它,因为我在MainActivity中有一个变量是在onResume()上设置的,并且在第一次启动时,服务还没有在onResume()运行时启动,所以在那个时间点服务仍然是空的。
此答案假设所讨论的服务运行在不同的进程中:
是的,有可能。一般的想法是,不仅你的Activity
通过AIDL定义的接口绑定了远程Service
,而且它还实现了Service
意识到的额外的AIDL接口,并将自己设置为远程Service
的回调目标。
您必须有2个AIDL文件:第一个描述Service
的接口,第二个描述Activity
的接口。
这种方案的实现非常类似于这个答案中描述的"远程服务回调",尽管"回调"方法将不再是void
,而是返回您感兴趣的值。
设计注意事项:
上述方案将允许您从Activity
获得值,但我认为您不应该采取这种方式。从用例的描述来看,您似乎只想在恢复Activity
时向Service
传递一些值。由于您的Service
无论如何都是绑定的,您可以简单地将方法setSomeValue(int value)
添加到其AIDL定义中,并从onServiceConnected()
回调调用该方法。
这是可能的。您必须在服务中准备方法,以便在绑定服务后返回您的活动:
public void bindActivity(MyActivity activity){...}
那么在服务绑定到activity后,只需以MyActivity.this
作为参数调用此方法。
你可能不应该这么做。更明确的解决方案是使用LocalBroadcastManager来传递事件和数据,或者使用一些更有效的解决方案,如Otto来做同样的事情,但仍然没有从另一个组件直接访问一个组件的字段/方法。