2011-06-16 38 views
3

我需要創建一項活動,以啓動監視用戶位置的服務,並在特定區域內允許調用Activity更新其視圖以通知用戶。需要獲得服務才能與活動交談

由於有幾種不同的方式來處理服務,我有點困惑,這些方法對我的情況來說是正確的。

使用startService()stopService()方法:根據我的理解,我不能直接回復開始的活動。在google文檔中,有一個example顯示如何通過PendingIntent將BroadcastReceiver傳遞給服務並調用它,但我不認爲這允許我更新正在運行的活動的視圖...或者它會如何?

綁定的服務:從文檔似乎這將允許服務和活動之間的雙向通信,但也有人提到,綁定服務,不要在後臺運行indefinitely。現在我不需要甚至不希望服務無限期地運行,但是在最壞的情況下,我可能需要它在bg中運行至少一兩個小時而不會被殺死。

三(可能沒有那麼大)選項:在活動線程,這將使實時視圖更新容易,然後在的onPause事件運行位置服務,停止活動的位置服務,通過startService()將它傳遞給服務,並使用通知服務在用戶輸入定義的區域時提醒用戶。

任何意見將不勝感激。

  1. this

    ,如果你希望服務的結果發送回,然後啓動該服務能夠創建一個廣播一的PendingIntent(與getBroadcast()),並將其交付給客戶啓動服務的Intent中的服務。該服務然後可以使用廣播來傳送結果。

  2. this

    同時它還有另一個應用程序組件並沒有在後臺無限期地運行下去一個綁定的服務通常只生活。

+0

這聽起來像你可能想[使用信使綁定的服務(http://developer.android.com/guide/topics/fundamentals/bound-services.html嘗試#Messenger) – keno 2011-06-16 03:36:49

回答

5

啊,選項(2)可能是你想要的東西。您可以覆蓋onStartCommand以返回START_STICKY,並且該活動結束後服務將繼續運行。

當你bindService你可以得到實際的服務實例,然後調用你自定義的方法作爲溝通的方式。或者,您可以使用其中一個示例here

+0

這是一個很好的例子,但它並沒有說明我是否可以從服務中調用活動中的方法。這是可行的,還是隻能在相反的方向上工作? – chris 2011-06-16 13:29:35

+3

這是可行的:你調用服務上的方法並傳入Activity實例。然後,您可以調用活動中的任何方法(只要它們不是私人的,並且適合服務可見)。您必須非常小心地注意活動被破壞且不再有效的情況。 – Femi 2011-06-16 13:34:27

+0

對LocalServiceSample使用類似的樣式,並且傳遞對該活動的引用完美運行。謝謝 – chris 2011-06-17 12:50:35

8

您可以通過startService()綁定並啓動一項服務。使用ServiceConnection您可以進行雙向通信,並使用startService()/stopService()您可以控制它的使用壽命。

從Android網站的生命週期映像真正解釋得好: Lifecycle

通過結合和啓動服務,您將得到可以無限期地運行服務。只有滿足以下兩個條件,服務纔會停止:

  1. 沒有綁定的客戶端。
  2. stopService()被調用。

它需要多一點維護,但我發現這是最合理的選擇。

1

綁定服務將是實現這一目標的最佳方式。

將此代碼放入您的活動onCreate並通過實現返回活頁夾對象的onBind方法來定義您的服務。在您的服務中正確定義您的IBinder。

這將確保服務始終在後臺運行。每當您的活動開始時,它都會與服務綁定。在您的活動的onDestroy()方法中解除綁定服務。否則它會拋出ServiceLeakedException。

YourService service; 

    ServiceConnection serviceConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName name, IBinder binderService) { 
      service = ((YourService.ServiceBinder)binderService).getService(); 
     } 

     public void onServiceDisconnected(ComponentName name) { 

     } 
    }; 

    // ... and bind. 
    bindService(intent, serviceConnection, Context.BIND_AUTO_CREATE); 

根據任何計算,您的服務可以啓動您的活動本身。當它啓動時,它將與服務綁定。然後進一步的溝通可能發生

希望它能幫助:)

相關問題