2012-10-09 34 views
2

我已經創建了一項服務,並且正在使用bindService函數通過我的活動訪問它,但即使在我的活動退出後,我也想繼續運行我的服務。通過致電startService發送郵件服務

併爲我所用startService但以前我是用bindServiceServiceConnection在那裏我發送消息到handler(在服務)一旦onServiceConnected被調用。

但我不知道如何發送消息與startService,因爲我沒有任何地方像onServiceConnected發送消息到處理程序。

注意:我想繼續運行我的服務,即使我不在我的應用程序中,因爲我正在從我的服務更新小部件。

所以服務具有活性

  • 裏面兩個角色

    1. 更新的TextView一旦活動退出,服務將更新插件
  • +0

    你如何開始你的服務,我的意思是你可能會用意圖開始你的服務? –

    +0

    是的,因爲我想繼續在後臺運行我正在使用'startService' – Hunt

    +0

    好的,然後有什麼你想要發送到你的服務?你可以通過你曾經開始服務的相同意圖發送它。你有嘗試過嗎? –

    回答

    4

    你有3個選項與您的服務進行通信:

    • 把額外的意圖,並呼籲startService。你可以把它叫做 幾次,即使該服務已在運行
    • 創建一個Messenger和使用它的服務溝通
    • 使用bindService

    一定要在你的服務才能使用START_STICKY所以在活動結束後繼續運行,並且startForeground()顯示通知或您的服務將在一段時間後(平均30分鐘到1小時)被殺死。

    始動流量:

    • ClientActivity(CA)啓動該服務,並在意向到服務發送CA Messenger的地址作爲一個額外的。
    • 在服務啓動時,它將服務信使地址發送回 CA(使用CA Messenger地址發送消息)。
    • 最後,服務返回START_STICKY。

    有了這兩者,客戶端和服務器就會知道彼此的Messenger地址並且不需要綁定。

    要停止服務:

    要停止該服務使用您的活動follwoing:

    stopService(new Intent(ActivityClass.this, ServiceClass.class)); 
    

    重新連接:

    如果離開clieant活動(CA)和想要在應用重新啓動時重新連接到服務,您有兩種選擇:

    - 從您的CA再次啓動startService。這將再次調用服務中的onStartCommand。僅在服務尚未運行時才調用服務onCreate()。您可以使用上述的啓動流程來獲得服務Messenger;

    - 您可以使服務Messenger公開和靜態public static Messenger mMsgService = null;。因此,當您的CA啓動時,它可以檢查服務信使是否已被初始化(不爲空)並將其用於與服務進行通信。當設備停止時,需要設置mMsgService = null;

    祝你好運。

    +0

    因爲我使用'Messenger'來註冊客戶端並獲取值,所以第一個選項不會工作。但發送消息到服務,並在一個活動中接收它,我必須使用'bindService',但是當我存在時我得到'unBindService'並且服務停止 – Hunt

    +0

    當您啓動服務時,您可以將客戶端Messenger地址作爲額外在服務意圖。在服務啓動時,您將服務信使地址發送回客戶端(使用客戶端Messenger地址發送消息)。最後,您從服務啓動返回START_STICKY以保持其運行。有了這兩者,客戶端和服務器將知道對方的Messenger地址,並且不需要綁定。 – Luis

    +0

    我試過你的方法,但只要我離開活動,回到應用程序,我失去了服務信使地址,因此我無法停止服務。 – Hunt

    0

    沒有其他傳達給其他服務方式比綁定到該服務。在活動中綁定服務並不意味着該服務將(或需要)在服務的銷燬上解除綁定。如果您不調用unbindService方法,那麼綁定的Service將始終運行。所以解決方案綁定到服務,並且不要調用活動的unbindService onDestroy。

    +0

    如果我不解綁它,我會得到'服務泄漏異常'嗎? – Hunt

    +0

    不,你不會得到它,如果你啓動服務與應用上下文 – user936414

    +0

    ,即使我通過'this.getApplicationContext()'我得到'android.app.ServiceConnectionLeaked:活動com.ha.home.MyActivity'已泄漏' ServiceConnection com.ha.home.MyActivity $ 1 @ 448163e8'原來是在這裏綁定的 – Hunt

    相關問題