Aplicación en TSD y comunicación con 1C: Enterprise 8.3 a través del servicio HTTP. Parte 3 (BroadcastReceiver Obteniendo el código de barras)

1. La elección del método de intercambio. Descripción de la API.

2. Implementación de la API en el lado de 1C.

3. BroadcastReceiver. Recibimos datos de código de barras en el ejemplo de ATOL Smart.Lite


4. OnKeyUp. Obtenga un código de barras de un escáner con emulación de teclado

En esta parte, me gustaría centrarme en los detalles. En todos los tutoriales que encontré, las funciones se describen simplemente y aproximadamente dónde agregarlas.


Escribamos nuestra aplicación que escucha los mensajes de difusión y los muestra en una ventana emergente. Crea un proyecto con Empty Activity .

Package name especifica " com.domain.barcodeTest " Un montón de libros de texto. Ahora en el proyecto crearemos un package . Para mí, lo llamé utils, porque No sé a dónde más llevarlo. No funciona con la red, tampoco con la base de datos. No se ve como un modelo.
Por lo tanto, así.

imagen

La imagen resalta dónde crear el paquete. Dentro de las utils cree una clase (Kotlin File/Class ). Seleccionamos que sea una clase y la llamamos CustomBroadcastReceiver . Código de archivo completo:

CustomBroadcastReceiver.kt
 package com.domain.barcodeTest.utils import android.content.BroadcastReceiver import android.content.Context import android.content.Intent import android.widget.Toast class CustomBroadcastReceiver : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { //          val type = intent.getStringExtra("EXTRA_BARCODE_DECODING_SYMBOLE") val barcode = intent.getStringExtra("EXTRA_BARCODE_DECODING_DATA") //  .      . val sb = StringBuilder() sb.append("Type: $type, Barcode:$barcode\n") //    .    . Toast.makeText(context, sb.toString(), Toast.LENGTH_SHORT).show() // "data class",         . //      ,    . val bc = Barcode(type, barcode) } } } 


Creamos nuestra clase para recibir mensajes de difusión, heredando todo de BroadcastReceiver. En él, redefinimos el comportamiento de la función para recibir un mensaje ( onReceive ). En el nivel superior " com.domain.barcodeTest " crearemos otros models paquetes, y en él crearemos una clase " Barcode ". Código de archivo completo:

barcode.kt
 package org.innova_it.mws.models data class Barcode( val type: String?, val value: String? ) 


Por lo tanto, creamos la clase Barcode y creamos un constructor para ella. De todos modos, Kotlin es bueno. Ahora podemos usarlo libremente en la clase CustomBroadcastReceiver , el error debería desaparecer. Como resultado, tenemos la siguiente estructura.

imagen

En paquetes almacenamos objetos similares. Si se traduce a 1C, en el paquete de modelos almacenamos una descripción de los datos de 1C. Directorios, documentos con detalles y objetos subordinados. También almacenamos la descripción de las tablas de la base de datos y el formato para recibir datos a través de la red. Mirando hacia el futuro Aquí hay un ejemplo típico del modelo de la parte anterior para Nomenclatura. No se aplica a nuestro proyecto actual. Pero es más fácil de entender con un ejemplo.

modelos / wares.kt
 data class PayLoadWares( val quantity: Int, val wares: List<Ware> ) //      sqlLite(Room) //@SerializedName -  Retrofit      json @Entity(tableName = "wares_table") data class Ware( @PrimaryKey @NonNull @SerializedName("code") @Expose val code: String, @SerializedName("article") @Expose val article: String, @NonNull @SerializedName("name") @Expose val name: String, @SerializedName("fullName") @Expose val fullName: String, @NonNull @SerializedName("unit") @Expose val unit: String ) data class WareResponse( val result : Result, val payload: PayLoadWares ) 


Si imaginamos el proyecto como una estructura 1C, entonces cada paquete contendría clases: WaresModel (Modelo del directorio de bienes, WaresManager (Gerente del directorio de bienes), WaresObject (Objeto del directorio), WaresUI (Módulo del formulario), WaresActivity (Form). Pero en a diferencia de 1C, podemos describir propiedades comunes, métodos para todos los directorios en el modelo, y luego heredar de ellos. En 1C, la plataforma hace esto y no tenemos que pensarlo.
Cómo describir interfaces en 1C, ni siquiera lo sé. Esto debe enseñarse antes de la plena iluminación. Además sin esto será imposible.

Volvamos a nuestra aplicación. Lo siguiente que debemos hacer es firmar la solicitud para los eventos que necesitamos. Lo firmaremos dinámicamente, sin usar AndroidManifest.xml .

Para hacer esto, necesitamos agregar una variable y anular dos procedimientos en MainActivity .

Agregar variable

 class MainActivity : AppCompatActivity() { //   MainActivity   .      "CustomBroadcastReceiver",    "BroadcastReceiver" private val customBroadcastReceiver = CustomBroadcastReceiver() ... 

Suscríbete a los eventos. Redefina el comportamiento de dos métodos en MainActivity

 override fun onResume() { super.onResume() registerReceiver( customBroadcastReceiver, IntentFilter ("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST") ) } override fun onStop() { super.onStop() unregisterReceiver(customBroadcastReceiver) } 

Creo que todo es bastante transparente aquí. Firmamos una solicitud para recibir mensajes con un filtro. En lenguaje 1C Cuando se (onReceive) un mensaje (onReceive) se (onReceive) , donde la Fuente es "com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST" . Así es como se llama la utilidad interna para trabajar con el escáner en ATOL Smart.Lite. Y los datos que tenemos son

  • "EXTRA_BARCODE_DECODING_SYMBOLE" - Tipo "EXTRA_BARCODE_DECODING_SYMBOLE"
  • "EXTRA_BARCODE_DECODING_DATA" : los datos en sí

Y en realidad el mensaje se está procesando. Compilamos ejecutar. Lo comprobamos Tiene una pregunta Pregunta en los comentarios. Eso es todo. Ahora somos desarrolladores para Android. :)

Esta parte es adecuada para obtener el resultado deseado. Pero después de eso, debes ir y aprender los conceptos básicos de Java. Y solo entonces lo básico de Kotlin.

PD: Aquí me gustaría contactar a los desarrolladores de Android. Tengo una situación extraña Solía ​​firmar una aplicación en OnCreate () y cancelar la suscripción en onStop (). Pero después de que la aplicación fue a onPause (), y al reanudar onResume (), la aplicación se bloqueó al recibir un mensaje con un error. ¿Qué puede causar este comportamiento?

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


All Articles