Aplikasi pada TSD dan komunikasi dengan 1C: Enterprise 8.3 melalui HTTP-Service. Bagian 3 (BroadcastReceiver Mendapatkan Barcode)

1. Pilihan metode pertukaran. Deskripsi API.

2. Implementasi API di sisi 1C.

3. BroadcastReceiver. Kami menerima data barcode pada contoh ATOL Smart.Lite


4. OnKeyUp. Dapatkan kode batang dari pemindai dengan emulasi keyboard

Pada bagian ini, saya ingin fokus pada detail. Dalam semua tutorial yang saya temui, fungsi-fungsinya dijelaskan dan kira-kira di mana menambahkannya.


Mari kita menulis aplikasi kita yang mendengarkan pesan siaran dan menampilkannya di jendela sembulan. Buat proyek dengan Empty Activity .

Package name tentukan " com.domain.barcodeTest " Sekelompok buku teks. Sekarang dalam proyek kita akan membuat package . Bagi saya sendiri, saya menyebutnya utils, karena Saya tidak tahu ke mana lagi harus membawanya. Itu tidak bekerja dengan jaringan, dengan database juga. Itu tidak terlihat seperti model.
Karenanya, seperti ini.

gambar

Gambar menyoroti di mana membuat paket. Di dalam utils buat kelas (Kotlin File/Class ). Kami memilih bahwa itu adalah kelas, dan kami menyebutnya CustomBroadcastReceiver . Kode file lengkap:

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


Kami menciptakan kelas kami untuk menerima pesan siaran, mewarisi segalanya dari BroadcastReceiver. Di dalamnya, kami mendefinisikan kembali perilaku fungsi untuk menerima pesan ( onReceive ). Di tingkat atas " com.domain.barcodeTest " kita akan membuat satu lagi models paket, dan di dalamnya kita akan membuat kelas " Barcode ". Kode file lengkap:

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


Jadi, kami membuat kelas Barcode dan membuat konstruktor untuknya. Semua sama, Kotlin baik. Sekarang kita dapat dengan bebas menggunakannya di kelas CustomBroadcastReceiver , kesalahan seharusnya hilang. Sebagai hasilnya, kami memiliki struktur berikut.

gambar

Dalam paket kami menyimpan objek serupa. Jika diterjemahkan ke dalam 1C, maka dalam paket model kami menyimpan deskripsi data 1C. Direktori, dokumen dengan detail dan objek bawahan. Kami juga menyimpan deskripsi tabel database dan format untuk menerima data melalui jaringan. Ke depan. Berikut adalah contoh khas model dari bagian sebelumnya untuk Nomenklatur. Itu tidak berlaku untuk proyek kami saat ini. Tetapi lebih mudah dipahami dengan sebuah contoh.

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 ) 


Jika kita membayangkan proyek sebagai struktur 1C, maka setiap paket akan berisi kelas: WaresModel (Model direktori barang, WaresManager (Manajer direktori barang), WaresObject (Objek direktori), WaresUI (Modul formulir), WaresActivity (Formulir). tidak seperti 1C, kita dapat menggambarkan properti umum, metode untuk semua direktori dalam model, dan kemudian mewarisi darinya. Pada 1C, platform melakukan ini dan kita tidak perlu memikirkannya.
Bagaimana cara menggambarkan antarmuka dalam 1C, saya bahkan tidak tahu. Ini harus diajarkan sebelum pencerahan penuh. Lebih jauh tanpa ini tidak mungkin.

Mari kita kembali ke aplikasi kita. Hal berikutnya yang perlu kita lakukan adalah menandatangani aplikasi untuk acara yang kita butuhkan. Kami akan menandatanganinya secara dinamis, tanpa menggunakan AndroidManifest.xml .

Untuk melakukan ini, kita perlu menambahkan variabel dan mengganti dua prosedur di MainActivity .

Tambahkan variabel

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

Berlangganan acara. Mendefinisikan kembali perilaku dua metode di MainActivity

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

Saya pikir semuanya cukup transparan di sini. Kami menandatangani aplikasi untuk menerima pesan dengan filter. Dalam bahasa 1C Saat pesan (onReceive) , di mana Sumbernya adalah "com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST" . Ini adalah bagaimana utilitas internal untuk bekerja dengan pemindai pada ATOL Smart.Lite menyebut dirinya. Dan data yang kami miliki adalah

  • "EXTRA_BARCODE_DECODING_SYMBOLE" - tipe "EXTRA_BARCODE_DECODING_SYMBOLE"
  • "EXTRA_BARCODE_DECODING_DATA" - Data itu sendiri

Dan sebenarnya pesan tersebut sedang diproses. Kami mengkompilasi run. Kami periksa. Punya pertanyaan? Tanyakan di komentar. Itu saja. Sekarang kami adalah pengembang untuk Android. :)

Bagian ini cocok untuk mendapatkan hasil yang diinginkan. Tetapi setelah itu, Anda harus pergi dan mempelajari dasar-dasar java. Dan hanya itulah dasar-dasar kotlin.

PS Di sini saya ingin menghubungi pengembang Android. Saya memiliki situasi yang aneh. Saya dulu menandatangani aplikasi di OnCreate (), dan berhenti berlangganan di onStop (). Tetapi setelah aplikasi pergi ke onPause (), dan ketika melanjutkan onResume (), aplikasi macet ketika menerima pesan dengan kesalahan. Apa yang bisa menyebabkan perilaku ini?

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


All Articles