2010-08-14 57 views
0

我有一个服务运行在我的android应用程序上,服务是一个套接字类,必须运行整个应用程序,我创建它时,我的第一个活动加载。 如何获取此套接字类的实例,以便我可以调用此类中的函数。Android ==>服务问题?

For example 
//how can i get an instance of the running service? 
MyService s = getService(); 
s.writeDataToServer("hello"); 

回答

1

Android接口定义语言(AIDL)是连接到服务的正确方式。

退房http://developer.android.com/guide/developing/tools/aidl.html

有关如何将设备与服务进行通信。

+0

1问题,我目前正在处理这个(服务和活动之间的通信)的方式,是通过使我的服务中的每个对象和方法都是静态的。 这是与服务进行通信的糟糕方式吗?例如,每当一次活动加载时,我都会做 MyService.setMainActivity(this); 所以我将我的活动实例传递给我的服务类中的静态变量。 当我想从我的活动向我的服务器发送消息时,我调用了我的服务类中的静态方法。 MyService.SendDataToServer(“hello”); 这是与我的服务沟通的不好方法吗? – aryaxt 2010-08-14 21:32:15

+3

是的,这是一种非常糟糕的做事方式。服务或活动可能在你不知情的情况下被杀死。但是,如果您将IPC框架构建到Android中,它将确保不会发生,或者如果它发生,它会优雅地处理它。从长远来看,使用AIDL接口要容易得多。这可能看起来令人生畏,但如果你花几分钟时间阅读它,那其实很简单。 – 2010-08-14 21:52:24

+0

为什么选择投票? – 2010-08-15 09:07:52

2

有两种方法可以实现此目的,具体取决于您是否希望在用户未主动使用UI时保持套接字打开。

第一个是LocalService它与常规的Service相同,除非它在与您的UI线程相同的进程中运行,因此您可以直接参考它。与使用AIDL相比,这是创建和使用服务的更轻量级的方法。如果您希望创建需要通过应用程序中的不同进程或不同应用程序访问的进程外服务,我只推荐使用AIDL。这很可能不是你需要的。 LocalService方法将允许您保持服务在后台运行,并保持打开状态,即使UI不在使用中也是如此。

如果您不需要保持套接字打开并且只希望从多个Activity中访问它,那么您可以扩展Application类并将其注册到清单中。它允许您管理全局应用程序状态。您可以将套接字创建和管理功能放入该类中,然后为您的各种Activity获取访问权限。 Application类会在进程死亡时死亡,因此它不适合长时间保持插槽的打开状态,或者在用户未主动使用应用程序的时候。

有内置Activity#getApplication()方法,有助于此过程。您可以通过android:name属性在AndroidManifest.xml中指定您的自定义Application类。

+0

关于LocalService的1个问题,我能够在活动之间进行导航时保持服务运行吗?我的应用程序中的每个活动都显示基于从服务器接收到的数据的数据,并且所有内容都基于会话(请求会话,登录等),因此套接字必须始终处于连接状态。 – aryaxt 2010-08-15 04:35:59

+1

是的,您可以调用startService或bindService与BIND_AUTO_CREATE。在这种情况下,您需要管理自己停止服务。 – Qberticus 2010-08-15 04:47:58