В процессе переноса приложения с iPhone на Android я ищу лучший способ общения внутри приложения. Намерения кажутся правильным решением, это лучший (единственный) вариант? NSUserDefaults кажется намного легче, чем Intents, как с точки зрения производительности, так и с точки зрения кодирования.
Я также должен добавить, что у меня есть подкласс приложения для состояния, но мне нужно сделать так, чтобы другое действие знало о событии.
Ответы:
Вы можете попробовать это: http://developer.android.com/reference/java/util/Observer.html
источник
Лучшим эквивалентом, который я нашел, является LocalBroadcastManager, который является частью пакета поддержки Android. .
Из документации LocalBroadcastManager:
Используя это, вы можете сказать, что
Intent
это эквивалентNSNotification
. Вот пример:ReceiverActivity.java
Действие, отслеживающее уведомления о названном событии
"custom-event-name"
.SenderActivity.java
Вторая активность, которая отправляет / рассылает уведомления.
В приведенном выше коде каждый раз, когда нажимается кнопка
R.id.button_send
, транслируется намерение, которое получаетmMessageReceiver
inReceiverActivity
.Результат отладки должен выглядеть так:
источник
NSNotificationCenter
, должен быть принятым ответом!Вот что-то похожее на ответ @Shiki, но с точки зрения разработчиков iOS и Центра уведомлений.
Сначала создайте какую-нибудь службу NotificationCenter:
Затем вам также понадобится некоторый тип перечисления для защиты от ошибок при кодировании со строками - (NotificationType):
Вот пример использования (добавление / удаление наблюдателей) в действиях:
и вот, наконец, как мы отправляем уведомление в NotificationCenter из какой-либо службы обратного вызова или отдыха или чего-то еще:
вот и все, ура!
источник
Bundle params
вместоHashMap
более удобно для передачи параметров разных типов. Существует связь между хорошоIntent
иBundle
:intent.putExtras(params)
Вы можете использовать это: http://developer.android.com/reference/android/content/BroadcastReceiver.html , что дает аналогичное поведение.
Вы можете зарегистрировать получателей программно через Context.registerReceiver (BroadcastReceiver, IntentFilter), и он будет фиксировать намерения, отправленные через Context.sendBroadcast (Intent).
Однако обратите внимание, что получатель не будет получать уведомления, если его активность (контекст) была приостановлена.
источник
Я обнаружил, что использование EventBus библиотеки Guava - это самый простой способ для связи между компонентами в стиле публикации-подписки, не требуя, чтобы компоненты явно регистрировались друг с другом.
см. их образец на https://code.google.com/p/guava-libraries/wiki/EventBusExplained
вы можете добавить эту библиотеку просто в Android Studio, добавив зависимость в свой build.gradle:
источник
Kotlin : Вот версия @ Shiki на Kotlin с небольшим рефакторингом во фрагменте.
Fragment.kt
Публикуйте уведомление где угодно. Только вам нужен контекст.
PS :
activity
(иногдаnull
) илиconext
нравится то, что использовал я.источник
Вы можете использовать слабые ссылки.
Таким образом, вы можете сами управлять памятью и добавлять и удалять наблюдателей по своему усмотрению.
Когда вы addObserver добавляете эти параметры - приведите этот контекст из действия, в которое вы его добавляете, к пустому интерфейсу, добавьте имя уведомления и вызовите метод для запуска интерфейса.
У метода для запуска интерфейса будет функция, которая называется run, чтобы вернуть данные, которые вы передаете, примерно так
Создайте класс наблюдения, который вызывает ссылку с пустым интерфейсом. Также создайте свой интерфейс Themethodtorun из контекста, передаваемого в addobserver.
Добавьте наблюдение в структуру данных.
Для вызова этого метода будет использоваться тот же метод, однако все, что вам нужно сделать, это найти конкретное имя уведомления в структуре данных, использовать Themethodtorun.run (имя_уведомления, данные).
Это отправит обратный вызов туда, где вы когда-либо создавали наблюдателя с определенным именем уведомления. Не забудьте удалить их, когда закончите!
Это хорошая ссылка для слабых ссылок.
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html
Я загружаю этот код на github. Глаза открыты!
источник