2013-02-18 36 views
2

我正在尋找一種啓動一個沒有這個類的Android服務的方法。 我發現了很多例子:開始一個沒有.class的Android服務

startService(new Intent(this,TheService.class));

我不想把服務類放進去,並且仍然有服務運行,直到我手動停止服務。

我不需要有服務的接口,因爲它只應該打開一些沒有任何參數的套接字。

服務運行時間不應該取決於應用程序的運行時間: 需要服務的第一個應啓動它,並且應該運行,直到它被手動停止。

所以我不能使用BroadcastReceiver,因爲他們活得太短。 綁定到服務將導致解除停止服務(我不想)。

有沒有辦法使用啓動服務沒有.class的服務? 替代方案: 有沒有辦法綁定到服務,而不會將生存期與啓動的應用程序鏈接?

+0

只是因爲它可能導致一個錯誤的設計決策:_I不能使用廣播接收器,因爲他們活得太短,聽起來很像你還不知道在BroadcastReveivers和Services的生命週期中,推理仍然是錯誤的,因爲一個_can_可以通過BroadcastReveiver啓動一個長時間運行的服務。另外,對服務的_binding_當然與Activity對象的生命週期有關,但_binding_時間跨度不一定與服務的_running_時間段相匹配。所以不要因誤解而做出設計決定。 – 2013-02-18 07:27:55

+0

如果你的'服務'想要控制自己的生命週期,你仍然可以使用bind/unbind來做到這一點。當一個客戶端綁定時,'Service'可以自行啓動(只需在'onBind()')中調用'startService()',這樣當客戶端解除綁定'Service'時不會自動停止。只要服務準備關閉,「服務」就可以停止。 – 2013-02-18 12:25:54

回答

3

您可以按名稱啓動它。就像這樣:

startService(new Intent("com.whatever.servicename")); 

你需要一個意圖過濾器添加到APK與服務:

<intent-filter> 
    <action android:name="com.whatever.servicename" /> 
    </intent-filter> 
+0

要說清楚,當你說「按名稱啓動它」時,你的意思是「通過意圖行動啓動它」。從理論上講,你的「com.whatever.servicename」也可以是「fred-and-et-et-out-out-the-garbage」或者「GobbledyGook123」,儘管按照慣例ACTION鍵應該以一個完全合格的包名開頭,以避免衝突。當您使用這樣的ACTION啓動服務時,Android會搜索所有已安裝的軟件包以查找具有與此ACTION匹配的Intent過濾器的服務。 – 2013-02-18 12:23:20