Android获取服务与活动进行通信?

时间:2010-06-25 08:58:22

标签: android service android-activity communication

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

我目前将服务绑定到活动而不使用AIDL作为服务,而活动在同一个应用程序中。

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

有人可以评论实现这一目标的最佳方式吗?

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

我想在服务和Activity之间进行紧密的沟通,我希望能够在事件发生时从我的服务中调用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启动时及时创建,绑定是我在我的Activities onCreate()中做的第一件事。

有没有办法让它立即绑定?

1 个答案:

答案 0 :(得分:3)

您无法直接调用Activity实例上的方法,您必须使用通过AIDL调用服务方法的相同IPC机制。

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

void setMyCallback(inout IMyCallback myCallback);

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