在TSD上的应用以及通过HTTP服务与1C:Enterprise 8.3的通信。 第三部分(BroadcastReceiver获取条形码)

1.交换方式的选择。 API说明。

2.在1C方面实现API。

3. BroadcastReceiver。 我们以ATOL Smart.Lite为例接收条形码数据


4. OnKeyUp。 使用键盘仿真从扫描仪获取条形码

在这一部分中,我将重点关注细节。 在我遇到的所有教程中,仅简单描述了功能以及添加位置。


让我们编写一个用于监听广播消息并将其显示在弹出窗口中的应用程序。 使用Empty Activity创建一个项目。

Package name指定“ com.domain.barcodeTest ”一堆教科书。 现在在项目中,我们将创建一个package 。 对于我自己,我称它为utils, 我不知道还能拿到哪里 它不适用于网络,也不适用于数据库。 它看起来不像模型。
因此,像这样。

图片

该图像突出显示了在何处创建软件包。 在utils创建一个类(Kotlin File/Class )。 我们选择它为一个类,并将其CustomBroadcastReceiver 。 完整文件代码:

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


我们创建了用于接收广播消息的类,该类继承了BroadcastReceiver的所有内容。 在其中,我们重新定义了接收消息的函数的行为( onReceive )。 在顶层“ com.domain.barcodeTest ”中,我们将创建另一个包models ,并在其中创建一个类“ Barcode ”。 完整文件代码:

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


因此,我们创建了Barcode类并为其创建了构造函数。 一样,Kotlin很好。 现在我们可以在CustomBroadcastReceiver类中自由使用它,该错误应该消失了。 结果,我们具有以下结构。

图片

在包装中,我们存储类似的对象。 如果转换为1C,则在模型包中存储1C数据的描述。 目录,带有详细信息的文档和从属对象。 我们还存储数据库表的描述以及用于通过网络接收数据的格式。 展望未来。 这是上一部分命名法模型的典型示例。 它不适用于我们当前的项目。 但是通过示例更容易理解。

型号/ 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 ) 


如果您将项目想象为1C结构,则每个包都将包含以下类:WaresModel(商品目录的模型,WaresManager(商品目录的管理器),WaresObject(目录的对象),WaresUI(表格的模块),WaresActivity(表格)。与1C不同,我们可以为模型中的所有目录描述通用属性,方法,然后从它们继承。在1C中,平台可以做到这一点,我们无需考虑。
我什至不知道如何用1C描述接口。 必须在充分启迪之前先教这些。 此外,如果没有这一点,这将是不可能的。

让我们回到我们的应用程序。 我们需要做的下一件事是为需要的事件签名应用程序。 我们将动态签名,而不使用AndroidManifest.xml

为此,我们需要添加一个变量并在MainActivity覆盖两个过程。

添加变量

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

订阅事件。 重新定义MainActivity中两个方法的行为

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

我认为这里的一切都很透明。 我们使用过滤器对接收消息的应用程序进行签名,以1C语言接收消息时(onReceive) ,其中的源为"com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST" 。 这就是在ATOL Smart.Lite上使用扫描仪的内部实用程序如何调用自身。 而我们拥有的数据是

  • "EXTRA_BARCODE_DECODING_SYMBOLE" - "EXTRA_BARCODE_DECODING_SYMBOLE"类型
  • "EXTRA_BARCODE_DECODING_DATA" -数据本身

实际上,该消息正在处理中。 我们编译运行。 我们检查。 有问题吗? 在评论中提问。 仅此而已。 现在我们是Android开发人员。 :)

这部分适合获得所需的结果。 但是之后,您必须去学习Java的基础知识。 而且只有那时,kotlin的基础知识。

PS在这里,我想联系Android开发人员。 我有一个奇怪的情况。 我曾经在OnCreate()中签署应用程序,然后在onStop()中退订。 但是在应用程序转到onPause()之后,并且在恢复onResume()之后,该应用程序在收到带有错误的消息时崩溃了。 什么会导致这种行为?

Source: https://habr.com/ru/post/zh-CN473574/


All Articles