【问题标题】:Can a service access a variable within an Activity?服务可以访问 Activity 中的变量吗?
【发布时间】:2016-08-12 09:15:26
【问题描述】:

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

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

【问题讨论】:

  • 我从意图服务中的应用程序类访问了变量。不确定活动。
  • 你为什么不使用共享属性呢?
  • 我不认为它可以。我也称之为糟糕的设计。服务应该独立于 UI 的东西。如果服务需要来自 UI 的值,请设计 UI 以在服务中设置值。

标签: android android-service


【解决方案1】:

此答案假定相关服务在不同的进程中运行:

是的,这是可能的。一般的想法是,不仅你的Activity通过一些AIDL定义的接口绑定远程Service,而且它还实现了Service知道的附加AIDL接口,并将自己设置为远程@的回调目标987654325@.

您必须有 2 个 AIDL 文件:第一个描述Service 的接口,第二个描述Activity 的接口。

这种方案的实现与this answer中描述的“远程服务回调”非常相似,虽然“回调”方法不再是void,而是返回您感兴趣的值。

设计注意事项:

上述方案将允许您从Activity 获取值,但我认为您不应该走这条路。从用例的描述来看,当Activity 恢复时,您似乎只想将一些值传递给Service。由于您的Service 无论如何都已绑定,因此您只需将方法setSomeValue(int value) 添加到其AIDL 定义中,然后从onServiceConnected() 回调中调用此方法。

【讨论】:

  • AIDL 文件只有在不同应用程序之间共享服务时才需要。
  • @piotrpo,好点子!我只是假设涉及到 IPC,但现在我看到在服务存在于哪个进程中的问题中没有说明。
【解决方案2】:

是的,这是可能的。 您必须在服务中准备方法以在服务绑定后返回您的活动:

public void bindActivity(MyActivity activity){...}

那么在服务绑定到活动之后,只需以MyActivity.this为参数调用该方法即可。

但是...

您可能不应该这样做。更明确的解决方案是使用 LocalBroadcastManager 来传递事件和数据,或者使用一些更有效的解决方案(如 Otto)来做同样的事情,但仍然 - 无需从另一个组件直接访问一个组件的字段/方法。

【讨论】:

  • Service 依赖于Activity 不是一个好主意。如果这个方法的参数是某个接口会更简洁,MainActivity 会简单地实现它。
  • 在我看来,唯一真正“干净”的解决方案是一些基于消息的解决方案。当然,根据 OOD 规则引入一些接口是个好主意,但仍然 - 问题不在于设计,而在于实现。
  • 不需要消息 - Service 是绑定的,因此只需一个简单的函数调用就足够了。接口是实现的一部分,否则实现不干净;)
猜你喜欢
  • 1970-01-01
  • 2014-03-23
  • 2011-07-01
  • 1970-01-01
  • 2015-03-22
  • 1970-01-01
  • 2015-09-04
  • 1970-01-01
  • 2011-03-20
相关资源
最近更新 更多