Desenvolvemos um aplicativo que envia dados para outros aplicativos (aplicativo do ecossistema)

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:

  1. De alguma forma, faça JSON a partir do objeto passado
  2. Enviar transmissão
  3. Aceitar transmissão em outro aplicativo
  4. 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

Source: https://habr.com/ru/post/pt467205/


All Articles