Hola chicos
Este es mi segundo artículo sobre el desarrollo de
mi proyecto . Para aquellos que no han leído el
artículo anterior : se trata de cómo exportar automáticamente datos de un lugar (tabla de google) a otro (hogar).
Hoy les contaré cómo escribí (y diseñé) la biblioteca para que las aplicaciones de terceros puedan recibir los datos enviados por mi aplicación. Le pregunto a todos los interesados bajo cat.
Parte 1. Problema
Brevemente sobre el proyecto. Hay un dispositivo que se conecta a un teléfono inteligente. Ahí está mi aplicación, dentro de la cual la red neuronal reconoce los datos del dispositivo y da el resultado. Y hay otras aplicaciones que desean obtener este mismo resultado.
El resultado puede ser de varios tipos: datos desnudos del dispositivo, datos procesados del dispositivo, información sobre el estado del dispositivo, información sobre los derechos de acceso de la aplicación a los datos (por ejemplo, que el usuario ha revocado los derechos de acceso a los datos del dispositivo). Es necesario transferir de alguna manera este mismo resultado a otras aplicaciones.
Si de repente estoy explicando algo incorrectamente con mi código,
aquí está la documentación de mi biblioteca.
Parte 2. Planificando una solución
Hay un mecanismo maravilloso: las transmisiones. En resumen, este es un mensaje de una aplicación a otras aplicaciones. Puede enviarlo a todos de inmediato, o puede enviarlo a uno específico.
Para enviar y recibir este negocio, necesita:- De alguna manera hacer JSON desde el objeto pasado
- Enviar difusión
- Aceptar Broadcast en otra aplicación
- Recuperar objeto transmitido desde JSON
En general, hacer un JSON a partir de un objeto no siempre es correcto. Puede enviar una cosa llamada Parcelable vía Broadcast, o Serializable. Serializable es algo estándar de Java, Parcelable es algo similar, pero optimizado para dispositivos móviles.
Mis objetos son bastante pequeños. Además, a menudo es necesario obtener JSON: yo mismo escribí una aplicación de terceros para que envíe datos sin procesar al servidor. Por lo tanto, elegí "hacer JSON del objeto pasado". Quizás entonces cambie de opinión.
Parte 3. Aserrar la solución
Párrafo 1 y párrafo 4. En JSON, y luego de regreso
Todo es simple aquí. Hay una biblioteca de
Gson que se adapta maravillosamente a nuestras necesidades.
Para hacer las cosas geniales, anule el método toString (). Bueno, haz fromString () para recuperar nuestro 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) } } }
Punto 2. Enviamos el objeto
Aquí hay un ejemplo de dicho código:
val intent = Intent() intent.action = BroadcastUtils.BROADCAST_GESTURE intent.putExtra(BroadcastUtils.EXTRA_GESTRE, it.toString()) sendBroadcast(intent)
Aquí creamos la intención, establecemos su acción, colocamos el objeto y lo enviamos como difusión.
BroadcastUtils.BROADCAST_GESTURE es una pequeña cosa por la cual filtraremos las transmisiones entrantes en otra aplicación (ya sea que se procese o no).
Para enviar un mensaje a una aplicación específica, debe especificar adicionalmente lo siguiente:
intent.component = ComponentName( PermissionsFetcher.REFACE_APP, "${PermissionsFetcher.REFACE_APP}.receivers.ActionsReceiver" )
PermissionsFetcher.REFACE_APP es la APPLICATION_ID de mi aplicación, y $ {PermissionsFetcher.REFACE_APP} .receivers.ActionsReceiver es la ruta al receptor.
Punto 3. Recibimos objetos
Así es como registramos el receptor. Si lo registra utilizando el contexto de la aplicación, recibirá transmisiones hasta que se cierre la aplicación. Si usa el contexto de activación, hasta que se cierre.
registerReceiver(GesturesReceiver(), IntentFilter(BroadcastUtils.BROADCAST_GESTURE))
Y aquí está el GesturesReceiver: class GesturesReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { Timber.i("Received gesture") val action = BroadcastUtils.reparseGestureIntent(intent) MainApp.actionSubject.onNext(action) } }
Aquí, como puede ver, recibí la intención, la volví a hacer a un objeto y la envié a algún lugar usando RxJava.
Parte 4. Conclusión
Leyó un artículo sobre el diseño de aplicaciones que deberían interactuar con otras aplicaciones. Espero que esta experiencia te ayude con algo.
Para mejorar el efecto, puede ver las fuentes de mi biblioteca y un ejemplo de cómo trabajar con él y poner un asterisco en caso de que lo necesite:
github.com/reface-tech/CodeSpecialApp