2010-06-05 41 views
13

我有一個Android服務,即使在最後一個Activity彈出堆棧或者用戶選擇了其他操作之後,我仍想繼續運行該服務。Android服務如何知道它沒有綁定到任何活動

本質上,服務正在監聽遠程服務器上的更改,並且當且僅當應用程序的活動未運行(或可見)時,我想生成通知。換句話說,我不希望在用戶直接與應用程序交互時發生通知。

在用戶直接與應用程序交互的情況下,服務將通知活動並根據更改更新適當的UI元素。我計劃通過觀察者模式來實現這一點。

服務如何知道是否沒有任何應用程序活動被綁定到它?

感謝, Ĵ

回答

-2

服務怎樣才能知道,如果沒有的 應用活動必然呢?

如果您的Observer列表爲空,您知道是否沒有綁定Activities

+4

以及我們應該如何檢查Observer列表? – Ewoks 2012-07-05 15:34:52

+0

@Ewoks:這取決於你如何實現它。你會注意到OP沒有解釋這一點。此外,您會在頁面的右上角找到一個「Ask Question」按鈕。通常認爲這個問題的答案很糟糕,並且回答問題和答案的歷史一樣古老 - 而是提出一個新的問題。 – CommonsWare 2012-07-05 15:40:49

25

你需要使用一個布爾與onBind,onUnbind和onRebind方法:當所有客戶端已經斷開

public boolean bound; 

@Override 
public Binder onBind(Intent intent){ 
    bound = true; 
    return myBinder; //declare and init your binder elsewhere 
} 

@Override 
public boolean onUnbind(Intent intent) { 
    bound = false; 
    return true; // ensures onRebind is called 
} 

@Override 
public void onRebind(Intent intent) { 
    bound = true; 
} 

onUnbind只調用。因此約束將保持,直到所有客戶端已斷開連接。

**注意:根據Gil的反饋進行編輯。 **

+0

如果你知道你將只有一個綁定客戶端,這很好。但是,如果你有兩個或更多,它將無法工作。將「bound」更改爲int並跟蹤綁定客戶端的數量。否則,在你的情況下,如果有兩個連接的客戶端和斷開連接,「綁定」將被設置爲「假」。 – psiphi75 2014-03-21 01:57:05

+1

@ psiphi75:僅在所有客戶端斷開連接時調用onUnbind,因此不需要跟蹤綁定客戶端的數量。 – SharkAlley 2014-04-03 01:38:19

11

我不能評論SharkAlley的回答,所以我在這裏重播。

不幸的是,每次客戶端連接時,onBind()都會調用而不是。例如,見夫人Hackborne的答案在這裏:https://groups.google.com/d/msg/android-developers/2IegSgtGxyE/iXP3lBCH5SsJ

一個可能的解決方案是從onUnbind()國旗上onBind()onRebind()(假的onUnbind())返回true,並設置爲true兩者。

+1

我創建了一個測試項目來確認這一點並更新了我的答案。感謝您的反饋。 – SharkAlley 2013-07-20 12:58:19

相關問題