【问题标题】:Android getting a Service to communicate with an Activity?Android让服务与活动通信?
【发布时间】:2010-06-25 08:58:21
【问题描述】:

我的应用程序中目前有一个服务和一个活动。

我目前不使用 AIDL 将 Service 绑定到 Activity,因为 Service 和 Activity 在同一个应用程序中。

这允许我在需要时从我的 Activity 中调用服务中的方法,但是它不允许我在需要时从我的服务中调用 Activity 的方法。

谁能评论实现这一目标的最佳方法是什么?

我可以使用 Intents,但有其他选择吗?

我希望 Service 和 Activity 之间有紧密的通信,我希望能够在事件发生时从我的 Service 调用 Activity 方法。

感谢 ognian 的出色建议。

编辑 2:

我现在可以按照我想要的方式运行它,但是我遇到了一个问题。

我的服务获取状态更新,然后我的 Activity 应该对从服务发送的更新做出反应。

问题是,当我开始我的活动时,我在调用 onBind 之前获得了拨号状态,然后是连接状态,我获得了 iCallDialogActivity 的实例。

logcat 的以下输出可能会让事情更清楚。

06-28 10:56:48.702: DEBUG/TestPhone(3498): Status: EStatusDialling
06-28 10:56:48.751: DEBUG/TestPhone(3498): Status: EStatusConnected
06-28 10:56:49.122: DEBUG/TestPhone(3498): Status: onBind Called    <------------- 
06-28 10:56:49.141: DEBUG/TestPhone(3498): Status: iCallDialogActivity instance  <------------- 
06-28 10:56:51.641: DEBUG/TestPhone(3498): Status: EStatusDisconnecting
06-28 10:56:51.651: DEBUG/TestPhone(3498): Status: EStatusIdle

当我收到拨号和连接状态通知时,我需要能够使用我的 iCallDialogActivity。

但这给了我一个 NullPointer 异常,因为它没有在我的 Activity 启动时及时创建,绑定是我在我的 Activity onCreate() 中做的第一件事。

有没有办法让它直接绑定?

【问题讨论】:

  • 在您的服务代码中,方法“public void setCallback(ICallDialogActivity callDialogActivity)”必须实际设置对回调的服务全局引用。然后您可以在服务中需要它的地方使用它。此外,您需要添加 removeCallback() 方法,您将在 Activity 的 onDestroy() 中调用该方法,否则 Service 可能最终会调用死 Activity。你应该仔细设计这个,因为 Service 和 Activity 有完全不同的生命周期
  • 感谢ognian,我已经实现了它,现在我已经掌握了我必须做的事情,但是我遇到了另一个问题并相应地编辑了我的帖子,你对我的新问题有什么见解吗?

标签: android service android-activity communication


【解决方案1】:

您不能直接调用 Activity 实例上的方法,您必须使用与通过 AIDL 调用 Service 方法相同的 IPC 机制。

首先,您需要声明一些您希望公开为回调的方法。在单独的 .aidl 文件中执行此操作。然后将该回调的 setter 添加到 Service 的 AIDL,例如:

void setMyCallback(inout IMyCallback myCallback);

如果你制作了 IMyCallback.aidl。请记住在 Service 的 .aidl 中 import 它,即使它在同一个包中。在您的活动中,从该 .aidl 实例化一个存根,并在回调之前将其传递给服务。

【讨论】:

  • 所以我需要走 AIDL 路线,尽管不需要进程间通信?
  • 是的,Android 就是这样设计的。如果您的应用程序不跨越进程,您可以在 Activity 中有一些静态实例获取器并直接使用它。我会工作,但这不是最佳实践。 Android的IPC非常轻量级,正常场景下不用担心性能问题。
  • 你能给我指出一个很好的教程吗?我似乎找不到一个使用 AIDL 来允许从 Activity 调用服务的方法。
  • 另外,我目前没有Service.aidl文件,我的服务目前是绑定到Activity的,没有使用aidl
  • 我不知道教程,但在 Android 的文档中有一个示例 .aidl,它有一个带有另一个 .aidl 参数的方法:developer.android.com/guide/developing/tools/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-07-27
  • 1970-01-01
  • 1970-01-01
  • 2020-11-13
  • 2016-12-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多