2013-04-10 253 views
1

我對Android服務類仍然有點新鮮。我知道你需要用startService(intent)從你的應用程序啓動服務,但是我的問題是我的服務裏面有方法。我需要以意圖啓動服務,然後在我的Activity中創建該類的對象,以便可以調用該服務的方法。問題是,當我這樣做時,我創建了一個服務實例,當我在一個intent和另一個服務實例中啓動服務時,在我的活動中創建了一個類的對象。這意味着當我創建服務的對象時,從startService(intent)傳遞給服務的任何數據都不存在。任何解決這個問題的方法還是我完全濫用服務類?我可以給一些代碼,但其基本上是這樣的:Android服務多個實例

//Create Object of ControlPanel service class. 
ControlPanel cPanel = new ControlPanel(); 
//Create intent for starting ControlPanel service class 
Intent controlPanel = new Intent(this, cPanel.getClass()); 
//Start Service 
startService(controlPanel); 

回答

7

我會說你濫用類:-)。

多次調用startService()不會導致啓動多個服務。

doc

請求一個給定的應用服務啓動。 Intent可以包含要啓動的特定服務實現的完整類名,也可以包含通過動作和其他類型服務的其他字段的抽象定義來啓動。如果此服務尚未運行,它將被實例化並啓動(如果需要,將爲其創建一個進程);如果它正在運行,那麼它仍然在運行。

你也應該覆蓋onStartCommand()。如果尚未啓動,則第一個startService調用會啓動該服務。在任何情況下,onStartCommand將攔截任何進一步的startService調用和您想要發送給它的意圖。

3

任何解決方法或我是完全濫用服務類?

您完全濫用Service類。

Service經由兩個基本模式使用:

  1. 發送給它的命令,經由startService()

  2. 綁定到它,通過bindService()調用由Service公開的API。

更準確地綁定描繪你正在嘗試做的(「這樣我就可以調用該服務的方法」),但結合是棘手的獲得的權利,特別是當它涉及到配置更改。

因此,我首先建議你坐下來,並確定完全準確地爲什麼你首先使用Service。例如,ControlPanel是我將與UI關聯的名稱,而不是無UI(「背景」)操作。然後才能確定命令或綁定模式是否適合您的用例。

+0

我會看看bindService()。我之前簡要地閱讀了它,但從來沒有用過它。我不明白我能找到什麼。你可以推薦任何好的教程頁面? – 2013-04-10 16:56:06

+0

@TravisElliott:「你可以推薦任何好的教程頁面?」 - 我確信有一些,但我不知道我的頭頂有什麼。我最簡單的示例是https://github.com/commonsguy/cw-omnibus/tree/master/AdvServices/Binding,但它來自我的書的高級篇章,因此假設了其他內容(如片段)的使用經驗。 – CommonsWare 2013-04-10 17:01:03

+0

這樣做的關鍵是我需要服務在我調用它的方法時執行工作,然後通過信使發送信息到主要活動。該服務有一個可運行的線程,在後臺線程上執行工作(通過tcp套接字發送數據)。任何想法在更好的方式來做到這一點。我真的不想使用Intent服務,因爲另一個線程也需要保持運行以接收數據。 – 2013-04-10 17:21:07

-5

你可以用一個服務類來做到這一點。

public static int myStaticMethod(){ 
     return 1; 
    } 

只需製作訪問靜態所需的方法即可。

+0

我不確定這是否回答了問題。 – 2015-09-27 00:54:57

+1

肯定沒有。 – JHH 2016-10-13 09:15:28