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

时间:2016-08-12 09:15:27

标签: android android-service

我有一个名为MainActivity的Activity,它启动一个名为MainService的服务。它还绑定了Service,因此MainActivity可以访问MainService中的方法和公共变量。是否有可能以相反的方式进行,即服务能够访问活动的方法?

我希望以这种方式实现它,因为我在onAesume()上设置了MainActivity中的变量,并且在第一次启动时,onResume()运行时服务尚未启动,所以在那个时间点服务仍然是空的。

2 个答案:

答案 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)来做同样的事情,但仍然 - 不能直接访问另一个组件的字段/方法。