我有一個名爲MainActivity的Activity啓動一個名爲MainService的服務。它也綁定了服務,所以MainActivity可以訪問MainService中的方法和公共變量。是否有可能以相反的方式做到這一點,即服務能夠訪問活動的方法?服務可以訪問活動中的變量嗎?
我希望以這種方式實現它,因爲我在onResume()中設置了MainActivity中的一個變量,並且在第一次啓動時服務在onResume()運行時尚未啓動,因此在那個時間點該服務仍然爲空。
我有一個名爲MainActivity的Activity啓動一個名爲MainService的服務。它也綁定了服務,所以MainActivity可以訪問MainService中的方法和公共變量。是否有可能以相反的方式做到這一點,即服務能夠訪問活動的方法?服務可以訪問活動中的變量嗎?
我希望以這種方式實現它,因爲我在onResume()中設置了MainActivity中的一個變量,並且在第一次啓動時服務在onResume()運行時尚未啓動,因此在那個時間點該服務仍然爲空。
這個回答假設問題的服務在不同的進程中運行:
是的,這是可能的。總體思路是,不僅您的Activity
通過某個AIDL定義的接口綁定遠程Service
,而且它還實現了Service
所知的其他AIDL接口,並將其自身設置爲遠程Service
的回調目標。
您必須有2個AIDL文件:第一個描述Service
的接口,第二個描述Activity
的接口。
這種方案的實施是非常相似的「遠程服務回調」,在this answer來形容,雖然「回調」的方法將不再是void
,但回報你感興趣的值。
設計注意事項:
上述方案將允許您從Activity
獲得值,但我認爲您不應該採取這種方式。從你的用例的描述看來,當Activity
恢復時,你只想將某個值傳遞給Service
。由於您的Service
已被綁定,您可以簡單地將方法setSomeValue(int value)
添加到其AIDL定義中,並從onServiceConnected()
回調中調用此方法。
是的,這是可能的。 你必須在你的服務做準備的方法即可返回您的活動服務綁定剛過:
public void bindActivity(MyActivity activity){...}
然後服務綁定到活動後,只需要調用此方法MyActivity.this
作爲參數。
但是...
你可能不應該這樣做。更爲明確的解決方案是使用LocalBroadcastManager傳遞事件和數據,或者使用一些更有效的解決方案(如Otto)來做同樣的事情,但仍然是 - 無需從另一個組件的字段/方法直接訪問。
我從意向服務中的應用程序類訪問變量。不確定活動。 –
爲什麼不使用共享屬性呢? –
我不認爲它可以。我也叫這個糟糕的設計。服務應該獨立於UI的東西。如果服務需要來自UI的值,請設計UI以在服務中設置值。 –