Application sur TSD et communication avec 1C: Enterprise 8.3 via HTTP-Service. Partie 3 (BroadcastReceiver obtenir le code-barres)

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 clavier

Dans 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.

image

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) { //          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) } } } 


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.

image

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> ) //      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 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() { //   MainActivity   .      "CustomBroadcastReceiver",    "BroadcastReceiver" private val customBroadcastReceiver = CustomBroadcastReceiver() ... 

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?

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


All Articles