Ich bin ein iOS-Entwickler und habe eine Lösung ähnlich wie NotificationCenter entwickelt:
object NotificationCenter {
var observers: MutableMap<String, MutableList<NotificationObserver>> = mutableMapOf()
fun addObserver(observer: NotificationObserver, notificationName: NotificationName) {
var os = observers[notificationName.value]
if (os == null) {
os = mutableListOf<NotificationObserver>()
observers[notificationName.value] = os
}
os.add(observer)
}
fun removeObserver(observer: NotificationObserver, notificationName: NotificationName) {
val os = observers[notificationName.value]
if (os != null) {
os.remove(observer)
}
}
fun removeObserver(observer:NotificationObserver) {
observers.forEach { name, mutableList ->
if (mutableList.contains(observer)) {
mutableList.remove(observer)
}
}
}
fun postNotification(notificationName: NotificationName, obj: Any?) {
val os = observers[notificationName.value]
if (os != null) {
os.forEach {observer ->
observer.onNotification(notificationName,obj)
}
}
}
}
interface NotificationObserver {
fun onNotification(name: NotificationName,obj:Any?)
}
enum class NotificationName(val value: String) {
onPlayerStatReceived("on player stat received"),
...
}
Einige Klassen, die eine Benachrichtigung beobachten wollen, müssen dem Beobachterprotokoll entsprechen:
class MainActivity : AppCompatActivity(), NotificationObserver {
override fun onCreate(savedInstanceState: Bundle?) {
...
NotificationCenter.addObserver(this,NotificationName.onPlayerStatReceived)
}
override fun onDestroy() {
...
super.onDestroy()
NotificationCenter.removeObserver(this)
}
...
override fun onNotification(name: NotificationName, obj: Any?) {
when (name) {
NotificationName.onPlayerStatReceived -> {
Log.d(tag, "onPlayerStatReceived")
}
else -> Log.e(tag, "Notification not handled")
}
}
Schließlich sollten Sie die Beobachter benachrichtigen:
NotificationCenter.postNotification(NotificationName.onPlayerStatReceived,null)
0 Stimmen
Waqas, haben Sie den Empfänger im Verzeichnis registriert? Wenn ja, lassen Sie mich bitte wissen, wie?
2 Stimmen
Ich glaube nicht, dass Sie einen Empfänger für solche Sendungen im Manifest registrieren müssen, denn wenn Sie das tun, wird dieser Empfänger auch globale Sendungen empfangen.
3 Stimmen
Wahr. Das bedeutet, dass ich den Code wie in der folgenden Antwort beschrieben eingeben muss;
LocalBroadcastManager.getInstance(this).registerReceiver(mMessageReceiver, new IntentFilter("custom-event-name"));
2 Stimmen
LocalBroadcastManager
wurde veraltet. Ich ersetzte meine mit der EventBus-Bibliothek, die viel schöner ist, imo.