W trakcie przenoszenia aplikacji na iPhone'a na Androida szukam najlepszego sposobu komunikacji w ramach aplikacji. Wydaje się, że intencje są właściwą drogą, czy to najlepsza (jedyna) opcja? NSUserDefaults wydaje się znacznie lżejszy niż Intents zarówno pod względem wydajności, jak i kodowania.
Powinienem również dodać, że mam podklasę aplikacji dla stanu, ale muszę powiadomić inne działanie o zdarzeniu.
Odpowiedzi:
Możesz spróbować tego: http://developer.android.com/reference/java/util/Observer.html
źródło
Najlepszym odpowiednikiem, jaki znalazłem, jest LocalBroadcastManager, który jest częścią pakietu obsługi Androida .
Z dokumentacji LocalBroadcastManager:
Używając tego, możesz powiedzieć, że an
Intent
jest odpowiednikiem plikuNSNotification
. Oto przykład:ReceiverActivity.java
Działanie, które obserwuje powiadomienia o zdarzeniu o nazwie
"custom-event-name"
.SenderActivity.java
Drugie działanie, które wysyła / rozgłasza powiadomienia.
Z powyższego kodu, za każdym razem przycisk
R.id.button_send
zostanie kliknięty, zamiarem jest nadawany i odbierany jest przezmMessageReceiver
wReceiverActivity
.Wynik debugowania powinien wyglądać następująco:
źródło
NSNotificationCenter
, powinna być akceptowaną odpowiedzią!Oto coś podobnego do odpowiedzi @Shiki, ale z punktu widzenia programistów iOS i centrum powiadomień.
Najpierw utwórz rodzaj usługi NotificationCenter:
Następnie będziesz potrzebować również typu wyliczenia, aby zabezpieczyć się przed błędami w kodowaniu za pomocą ciągów - (NotificationType):
Oto użycie (dodawanie / usuwanie obserwatorów) na przykład w działaniach:
i oto w końcu, jak wysyłamy powiadomienie do NotificationCenter z jakiejś usługi oddzwonienia lub odpoczynku lub czegokolwiek:
to wszystko, na zdrowie!
źródło
Bundle params
zamiastHashMap
jest wygodniejsze przy przekazywaniu parametrów różnych typów. Istnieje dobre połączenie międzyIntent
aBundle
:intent.putExtras(params)
Możesz użyć tego: http://developer.android.com/reference/android/content/BroadcastReceiver.html , co daje podobne zachowanie.
Możesz zarejestrować odbiorców programowo za pomocą Context.registerReceiver (BroadcastReceiver, IntentFilter) i przechwytuje intencje wysłane przez Context.sendBroadcast (Intent).
Należy jednak pamiętać, że odbiornik nie otrzyma powiadomień, jeśli jego aktywność (kontekst) zostanie wstrzymana.
źródło
Odkryłem, że użycie EventBus z Guava lib jest najprostszym sposobem komunikacji między komponentami w stylu publikowania i subskrybowania bez konieczności jawnej rejestracji między komponentami
zobacz ich próbkę na https://code.google.com/p/guava-libraries/wiki/EventBusExplained
możesz dodać tę bibliotekę po prostu do Android Studio, dodając zależność do pliku build.gradle:
źródło
Kotlin : Oto wersja @ Shiki w Kotlinie z odrobiną refaktoryzacji we fragmencie.
Fragment.kt
Opublikuj powiadomienie w dowolnym miejscu. Tylko ty potrzebujesz kontekstu.
PS :
activity
(czasaminull
) lubconext
polubić to, czego użyłem.źródło
Możesz użyć słabych odniesień.
W ten sposób możesz samodzielnie zarządzać pamięcią oraz dodawać i usuwać obserwatorów według własnego uznania.
Po dodaniu Observer dodaj te parametry - prześlij ten kontekst z działania, do którego go dodajesz, do pustego interfejsu, dodaj nazwę powiadomienia i wywołaj metodę, aby uruchomić interfejs.
Metoda uruchamiania interfejsu miałaby funkcję, która nazywa się run, aby zwrócić dane, które przekazujesz, coś takiego
Utwórz klasę obserwacji, która wywołuje odwołanie z pustym interfejsem. Skonstruuj także interfejs Themethodtorun z kontekstu przekazywanego w addobserver.
Dodaj obserwację do struktury danych.
Aby to wywołać, byłaby ta sama metoda, ale wszystko, co musisz zrobić, to znaleźć konkretną nazwę powiadomienia w strukturze danych, użyj Themethodtorun.run (nazwa_ powiadomienia, dane).
Spowoduje to wysłanie oddzwonienia do miejsca, w którym kiedykolwiek utworzyłeś obserwatora o określonej nazwie powiadomienia. Nie zapomnij ich usunąć, gdy skończysz!
Jest to dobre odniesienie dla słabych odniesień.
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html
Jestem w trakcie przesyłania tego kodu na github. Miej oczy otwarte!
źródło