Oi pessoal!
Este é o meu segundo artigo sobre o desenvolvimento do
meu projeto . Para quem ainda não leu o
artigo anterior : trata-se de como exportar dados automaticamente de um local (tabela do Google) para outro (local).
Hoje vou lhe contar como escrevi (e projetei) a biblioteca para que aplicativos de terceiros possam receber dados enviados pelo meu aplicativo. Peço a todos os interessados em gato.
Parte 1. Problema
Brevemente sobre o projeto. Há um dispositivo que se conecta a um smartphone. Existe a minha aplicação, dentro da qual a rede neural reconhece dados do dispositivo e fornece o resultado. E há outros aplicativos que desejam obter esse mesmo resultado.
O resultado pode ser de vários tipos: dados simples do dispositivo, dados processados do dispositivo, informações sobre o status do dispositivo, informações sobre os direitos de acesso do aplicativo aos dados (por exemplo, que o usuário revogou direitos de acesso aos dados do dispositivo). É necessário, de alguma forma, transferir esse mesmo resultado para outras aplicações.
Se de repente eu estou explicando algo incorretamente pelo meu código -
aqui está a documentação da minha biblioteca.
Parte 2. Planejando uma solução
Existe um mecanismo maravilhoso - transmissões. Em resumo, esta é uma mensagem de um aplicativo para outros aplicativos. Você pode enviá-lo para todos imediatamente ou para um específico.
Para enviar e receber esta empresa, você precisa:- De alguma forma, faça JSON a partir do objeto passado
- Enviar transmissão
- Aceitar transmissão em outro aplicativo
- Recuperar objeto transmitido do JSON
Em geral, criar um JSON a partir de um objeto nem sempre é correto. Você pode enviar uma coisa chamada Parcelable via Broadcast ou Serializable. Serializável é uma coisa padrão do Java, Parcelable é uma coisa semelhante, mas otimizada para dispositivos móveis.
Meus objetos são bem pequenos. Além disso, muitas vezes é necessário obter o JSON: eu próprio escrevi um aplicativo de terceiros para que ele envie dados brutos para o servidor. Portanto, escolhi "make JSON a partir do objeto passado". Talvez então eu mude de idéia.
Parte 3. Serrando a solução
Parágrafos 1 e 4. No JSON, e depois
Tudo é simples aqui. Existe uma biblioteca
Gson que é maravilhosamente adequada às nossas necessidades.
Para tornar as coisas legais, substitua o método toString (). Bem, faça fromString () para recuperar nosso objeto.
class SecureData(val eeg1: Double?, val eeg2: Double?, date: Date) { override fun toString(): String { val gson = Gson() return gson.toJson(this) } companion object { fun fromString(model: String): SecureData { val gson = Gson() return gson.fromJson(model, SecureData::class.java) } } }
Ponto 2. Enviamos o objeto
Aqui está um exemplo desse código:
val intent = Intent() intent.action = BroadcastUtils.BROADCAST_GESTURE intent.putExtra(BroadcastUtils.EXTRA_GESTRE, it.toString()) sendBroadcast(intent)
Aqui criamos intenção, definimos sua ação, colocamos o objeto e o enviamos como difusão.
BroadcastUtils.BROADCAST_GESTURE é algo que filtrará as transmissões recebidas em outro aplicativo (se deve ser processado ou não).
Para enviar uma mensagem para um aplicativo específico, você precisa especificar adicionalmente o seguinte:
intent.component = ComponentName( PermissionsFetcher.REFACE_APP, "${PermissionsFetcher.REFACE_APP}.receivers.ActionsReceiver" )
PermissionsFetcher.REFACE_APP é o APPLICATION_ID do meu aplicativo e $ {PermissionsFetcher.REFACE_APP} .receivers.ActionsReceiver é o caminho para o destinatário.
Ponto 3. Recebemos objetos
É assim que registramos o receptor. Se você registrá-lo usando o contexto do aplicativo, ele receberá transmissões até que o aplicativo seja fechado. Se você usar o contexto de ativação - até que ele seja fechado.
registerReceiver(GesturesReceiver(), IntentFilter(BroadcastUtils.BROADCAST_GESTURE))
E aqui está o GesturesReceiver: class GesturesReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Timber.i("Received gesture") val action = BroadcastUtils.reparseGestureIntent(intent) MainApp.actionSubject.onNext(action) } }
Aqui, como você vê, recebi a intenção, refizi-a de volta a um objeto e enviei-a para algum lugar usando RxJava.
Parte 4. Conclusão
Você lê um artigo sobre o design de aplicativos que devem interagir com outros aplicativos. Espero que essa experiência ajude você com alguma coisa.
Para aumentar o efeito, você pode ver as fontes da minha biblioteca e um exemplo de como trabalhar com ela e colocar um asterisco, caso precise:
github.com/reface-tech/CodeSpecialApp