2010-08-14 61 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