No processo de portar um aplicativo do iPhone para o Android, estou procurando a melhor maneira de me comunicar dentro do aplicativo. As intenções parecem ser o caminho a percorrer. Esta é a melhor (única) opção? NSUserDefaults parece muito mais leve do que os Intents em desempenho e codificação.
Devo também acrescentar que tenho uma subclasse de aplicativo para estado, mas preciso tornar outra atividade ciente de um evento.
Respostas:
Você pode tentar isso: http://developer.android.com/reference/java/util/Observer.html
fonte
O melhor equivalente que encontrei é LocalBroadcastManager, que faz parte do Android Support Package .
Da documentação LocalBroadcastManager:
Ao usar isso, você pode dizer que um
Intent
é equivalente a umNSNotification
. Aqui está um exemplo:ReceiverActivity.java
Uma atividade que observa as notificações do evento nomeado
"custom-event-name"
.SenderActivity.java
A segunda atividade que envia / transmite notificações.
Com o código acima, toda vez que o botão
R.id.button_send
é clicado, um Intent é transmitido e recebido pormMessageReceiver
emReceiverActivity
.A saída de depuração deve ser semelhante a esta:
fonte
NSNotificationCenter
, deve ser a resposta aceita!Aqui está algo semelhante à resposta @Shiki, mas do ponto de vista dos desenvolvedores iOS e do centro de notificação.
Primeiro crie algum tipo de serviço NotificationCenter:
Então, você também precisará de algum tipo de enum para evitar erros na codificação com strings - (NotificationType):
Aqui está o uso (adicionar / remover observadores), por exemplo, em atividades:
e aqui está, finalmente, como postamos uma notificação no NotificationCenter de algum serviço de retorno de chamada ou de descanso ou qualquer outro:
é isso, saúde!
fonte
Bundle params
vez deHashMap
é mais conveniente para passar parâmetros de diferentes tipos. Há uma boa conexão entreIntent
eBundle
:intent.putExtras(params)
Você pode usar isto: http://developer.android.com/reference/android/content/BroadcastReceiver.html , que apresenta um comportamento semelhante.
Você pode registrar os receptores programaticamente por meio de Context.registerReceiver (BroadcastReceiver, IntentFilter) e ele irá capturar intents enviados por meio de Context.sendBroadcast (Intent).
Observe, entretanto, que um receptor não receberá notificações se sua atividade (contexto) tiver sido pausada.
fonte
Descobri que o uso de EventBus de Guava lib é a maneira mais simples de comunicação no estilo de publicação-assinatura entre componentes sem exigir que os componentes se registrem explicitamente uns com os outros
veja seu exemplo em https://code.google.com/p/guava-libraries/wiki/EventBusExplained
você pode adicionar esta lib simplesmente no Android Studio adicionando uma dependência ao seu build.gradle:
fonte
Kotlin : Aqui está uma versão de @Shiki em Kotlin com uma pequena refatoração em um fragmento.
Fragment.kt
Publique a notificação em qualquer lugar. Só você precisa do contexto.
PS :
activity
(às vezesnull
) ouconext
gostar do que usei.fonte
Você pode usar referências fracas.
Desta forma, você pode gerenciar a memória sozinho e adicionar e remover observadores como quiser.
Quando você addObserver adiciona esses parâmetros - transmita esse contexto da atividade que você está adicionando na interface vazia, adicione um nome de notificação e chame o método para executar a interface.
O método para executar a interface teria uma função que é chamada run para retornar os dados que você está passando algo assim
Crie uma classe de observação que invoca uma referência com uma interface vazia. Também construa sua interface Themethodtorun a partir do contexto que está sendo passado no addobserver.
Adicione a observação a uma estrutura de dados.
Para chamá-lo seria o mesmo método, porém tudo que você precisa fazer é encontrar o nome da notificação específica na estrutura de dados, use o Themethodtorun.run (notification_name, data).
Isso enviará um retorno de chamada para onde você criou um observador com um nome de notificação específico. Não se esqueça de removê-los quando terminar!
Esta é uma boa referência para referências fracas.
http://learningviacode.blogspot.co.nz/2014/02/weak-references-in-java.html
Estou enviando este código para o github. Mantenha os olhos abertos!
fonte