2010-06-25 81 views
2

我目前在我的应用程序中有一项服务和一项活动。Android获得服务与活动进行通信?

我当前将服务绑定到活动而不使用AIDL,因为服务和活动位于同一应用程序中。

这使我可以在需要时从我的Activity中调用服务中的方法,但它不会让我在需要时从我的Service中调用Activity的方法。

任何人都可以评论什么是最好的方式来实现这一目标?

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

我希望在服务和活动之间有紧密的沟通,我希望能够在事件发生时从我的服务中调用活动方法。

感谢爱尔兰人的出色建议。

编辑2:

我现在有工作的方式我想,但是我所遇到的一个问题。

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

问题是,当我开始我的活动时,我得到拨号状态,然后连接状态之前,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()中做的第一件事。

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

+1

在您的服务代码中,方法'public void setCallback(ICallDialogActivity callDialogActivity)'实际上必须设置服务全局引用到回调。然后,您可以在Service中需要的地方使用它。此外,您需要添加removeCallback()方法,您将在Activity的onDestroy()中调用该方法,否则Service可能会最终调用Dead Activity。你应该仔细设计这个,因为服务和活动有完全不同的生命周期 – ognian 2010-06-25 17:21:34

+0

感谢ognian,我已经实现了它,现在我已经掌握了我必须做的事情,但是我遇到了另一个问题并相应地编辑了我的帖子,你对我的新问题有什么看法? – 2010-06-28 10:08:00

回答

3

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

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

void setMyCallback(inout IMyCallback myCallback); 

如果您做了IMyCallback.aidl。请记住在服务的.aidl中使用import,即使它位于相同的包中。在您的活动中,从该.aidl实例化存根,并在回调之前将其传递给服务。

+0

所以我需要去AIDL路线,尽管不需要进程间通信? – 2010-06-25 10:20:03

+1

是的,这就是Android的设计。如果您的应用不跨越流程,您可以在您的活动中使用一些静态实例获取器并直接使用它。我会工作,但这不被认为是最佳做法。 Android的IPC非常轻便,可以在正常情况下担心性能。 – ognian 2010-06-25 10:35:50

+0

你能指点我一个很好的教程吗?我似乎无法找到AIDL用于允许来自Activity的服务调用方法的地方。 – 2010-06-25 11:30:49