服务可以访问Activity中的变量吗?



我有一个名为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来做同样的事情,但仍然没有从另一个组件直接访问一个组件的字段/方法。

最新更新