我目前在我的应用程序中有一个服务和一个活动。
我目前将服务绑定到活动而不使用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()中做的第一件事。
有没有办法让它立即绑定?
答案 0 :(得分:3)
您无法直接调用Activity实例上的方法,您必须使用通过AIDL调用服务方法的相同IPC机制。
首先,您需要声明一些您希望作为回调公开的方法。在单独的.aidl文件中执行此操作。然后将该回调的setter添加到Service的AIDL,例如:
void setMyCallback(inout IMyCallback myCallback);
如果你制作了IMyCallback.aidl。请记住在Service的.aidl中import
,即使它位于同一个包中。在您的Activity中,从该.aidl实例化Stub,并在回调之前将其传递给Service。