我的应用程序中目前有一个服务和一个 Activity 。
我目前将 Service 绑定(bind)到 Activity,但没有使用 AIDL,因为 Service 和 Activity 位于同一个应用程序中。
这允许我在需要时从 Activity 内的 Service 调用方法,但是它不允许我在需要时从 Service 内调用 Activity 的方法。
谁能评论一下实现这一目标的最佳方法是什么?
我可以使用 Intent ,但有其他选择吗?
我希望服务和 Activity 之间有紧密的通信,我希望能够在事件发生时从我的服务调用 Activity 方法。
感谢奥格尼安的出色建议。
编辑2:
我现在可以按照我想要的方式工作,但是我遇到了一个问题。
我的服务获取状态更新,然后我的 Activity 应该对从服务发送的更新使用react。
问题是,当我开始 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 启动时没有及时创建,绑定(bind)是我在 Activity onCreate() 中做的第一件事。
有没有办法让它立即绑定(bind)?
最佳答案
您不能直接调用 Activity 实例上的方法,您必须使用与通过 AIDL 调用 Service 方法相同的 IPC 机制。
首先,您需要声明一些您希望公开为回调的方法。在单独的 .aidl 文件中执行此操作。然后将该回调的 setter 添加到服务的 AIDL,例如:
void setMyCallback(inout IMyCallback myCallback);
如果您创建了 IMyCallback.aidl。请记住将其导入
到Service的.aidl中,即使它位于同一个包中。在您的 Activity 中,从该 .aidl 实例化一个 stub ,并在回调之前将其传递给服务。
关于Android 让 Service 与 Activity 进行通信?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3116744/