2012-03-31 53 views
0

我有一個接收互聯網狀態變化的廣播接收器。android BroadCastReceiver如何發送消息給聽衆


我希望能夠有聽衆的名單在這個接收器和他們每個人來更新網絡的狀態...

我的問題,每一次接收器是由被叫系統,它會創建我的類的新實例,並且不能引用我創建的接收者列表。

解決它的最好方法是什麼?

+0

像[this](http://stackoverflow.com/a/9443063/802469)可能會有所幫助。 – Jakar 2012-03-31 21:35:17

+0

[android鏈接列表的監聽器]的可能重複(http://stackoverflow.com/questions/9959366/android-linked-list-of-listeners) – CommonsWare 2012-03-31 22:36:17

回答

1

嘗試推送通知系統,如果你想擁有用戶列表,請嘗試使用UrbanAirShip。

+0

我其實已經想過其他的想法..但如何把列表作爲靜態?它的工作原理,但它是一個很好的解決方案? – 2012-03-31 21:30:12

+0

static可能似乎可以正常工作,但同樣,您的整個應用程序可隨時從內存中彈出。當發生這種情況時,你又回到原點了。如何或何時拋出取決於具體的設備和用戶在做什麼。 – 2012-03-31 21:49:41

+0

我想要做的唯一事情就是在我的活動中更改互聯網狀態。當互聯網上它說:「開」和關閉事件相同。我做了和事件實現接口,它應該如何工作.. – 2012-03-31 21:57:12

1

接收器旨在是無狀態的。你應該假設在onReceive()返回後接收器對象本身被銷燬。爲了記憶的目的,android不會讓你的應用永遠留在內存中。

你試圖做的事情是不可能的。你試圖在接收者之上實現可觀測模式,除了你發現的情況,你不能跟蹤接收者調用之間的觀察者集合。

很難告訴你如何解決它而不知道你的應用程序的大背景。如果觀察者都是無狀態對象,則可以將偏好設置爲類型的觀察者類型,使用工廠根據需要重新實例化它們。例如,在onReceive(),

String[] listeners = mPrefs.getString("listeners").split("|"); 
for (String l : listeners) { 
    MyListener listener = ListenerFactory.obtain(l); 
    listener.onWhatever(...); 
} 

或者你可以使用一個sqlite數據庫,無論什麼漂浮你的船。

另一個想法是將你的監聽器序列化爲一個sqlite數據庫,因爲它們是註冊的BLOB,將它們反序列化到接收器中執行回調,然後重新序列化到數據庫中。