1. Le choix de la méthode d'échange. Description de l'API.2. Implémentation de l'API côté 1C.3. BroadcastReceiver. Nous recevons des données de codes-barres sur l'exemple d'ATOL Smart.Lite
4. OnKeyUp. Obtenez un code-barres à partir d'un scanner avec émulation de clavierDans cette partie, je voudrais me concentrer sur les détails. Dans tous les tutoriels que j'ai rencontrés, les fonctions sont simplement décrites et approximativement où les ajouter.
Écrivons notre application qui écoute les messages diffusés et les affiche dans une fenêtre pop-up. Créez un projet avec l'
Empty Activity
.
Package name
spécifie "
com.domain.barcodeTest
" Un tas de manuels. Maintenant, dans le projet, nous allons créer un
package
. Pour moi, je l'ai appelé utils, car Je ne sais pas où le prendre. Cela ne fonctionne pas avec le réseau, avec la base de données non plus. Cela ne ressemble pas à un modèle.
Par conséquent, comme ça.

L'image met en évidence où créer le package. A l'intérieur des
utils
créez une classe
(Kotlin File/Class
). Nous sélectionnons qu'il s'agit d'une classe et nous l'appelons
CustomBroadcastReceiver
. Code de fichier complet:
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) {
Nous avons créé notre classe pour recevoir des messages de diffusion, héritant de tout de BroadcastReceiver. Dans ce document, nous avons redéfini le comportement de la fonction pour recevoir un message (
onReceive
). Au niveau supérieur "
com.domain.barcodeTest
", nous créerons un autre
models
package, et nous y créerons une classe "
Barcode
". Code de fichier complet:
barcode.kt package org.innova_it.mws.models data class Barcode( val type: String?, val value: String? )
Ainsi, nous avons créé la classe Barcode et créé un constructeur pour elle. Tout de même, Kotlin est bon. Maintenant, nous pouvons l'utiliser librement dans la classe
CustomBroadcastReceiver
, l'erreur devrait disparaître. En conséquence, nous avons la structure suivante.

Dans les packages, nous stockons des objets similaires. S'il est traduit en 1C, alors dans le package de modèles, nous stockons une description des données 1C. Répertoires, documents avec détails et objets subordonnés. Nous stockons également la description des tables de base de données et le format de réception des données sur le réseau. Pour l'avenir. Voici un exemple typique du modèle de la partie précédente pour Nomenclature. Cela ne s'applique pas à notre projet actuel. Mais c'est plus facile à comprendre avec un exemple.
models / wares.kt data class PayLoadWares( val quantity: Int, val wares: List<Ware> )
Si vous imaginez le projet comme une structure 1C, chaque package contiendrait des classes: WaresModel (modèle du répertoire des marchandises, WaresManager (gestionnaire du répertoire des marchandises), WaresObject (objet du répertoire), WaresUI (module du formulaire), WaresActivity (formulaire). Mais dans contrairement à 1C, nous pouvons décrire des propriétés communes, des méthodes pour tous les répertoires du modèle, puis en hériter. Dans 1C, la plate-forme le fait et nous n'avons pas à y penser.
Comment décrire les interfaces en 1C, je ne sais même pas. Cela doit être enseigné avant la pleine illumination. De plus, sans cela, ce sera impossible.
Revenons à notre application. La prochaine chose que nous devons faire est de signer la demande pour les événements dont nous avons besoin. Nous allons le signer dynamiquement, sans utiliser
AndroidManifest.xml
.
Pour ce faire, nous devons ajouter une variable et remplacer deux procédures dans
MainActivity
.
Ajouter une variable
class MainActivity : AppCompatActivity() {
Abonnez-vous aux événements. Redéfinissez le comportement de deux méthodes dans
MainActivity
override fun onResume() { super.onResume() registerReceiver( customBroadcastReceiver, IntentFilter ("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST") ) } override fun onStop() { super.onStop() unregisterReceiver(customBroadcastReceiver) }
Je pense que tout est assez transparent ici. Nous signons une application pour recevoir des messages avec un filtre. En langage 1C Lorsqu'un message est
(onReceive)
est
(onReceive)
, où la source est
"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST"
. C'est ainsi que l'utilitaire interne pour travailler avec le scanner sur ATOL Smart.Lite s'appelle. Et les données que nous avons sont
"EXTRA_BARCODE_DECODING_SYMBOLE"
- type "EXTRA_BARCODE_DECODING_SYMBOLE"
"EXTRA_BARCODE_DECODING_DATA"
- Les données elles-mêmes
Et en fait, le message est en cours de traitement. Nous compilons run. Nous vérifions. Vous avez une question? Demandez dans les commentaires. C’est tout. Maintenant, nous sommes des développeurs pour Android. :)
Cette pièce convient pour obtenir le résultat souhaité. Mais après cela, vous devez aller apprendre les bases de java. Et alors seulement les bases de la kotlin.
PS Ici, je voudrais contacter les développeurs Android. J'ai une situation étrange. J'avais l'habitude de signer une application dans OnCreate () et de me désinscrire dans onStop (). Mais après que l'application est passée à onPause (), et lors de la reprise de onResume (), l'application s'est bloquée lors de la réception d'un message avec une erreur. Qu'est-ce qui peut provoquer ce comportement?