如何从 BroadcastReceiver 在 Activity 中发送和保存字符串消息

Posted

技术标签:

【中文标题】如何从 BroadcastReceiver 在 Activity 中发送和保存字符串消息【英文标题】:How to send and save string message in Activity from BroadcastReceiver 【发布时间】:2020-03-14 13:01:49 【问题描述】:

如何保存来自 BroadcastReceiver 的字符串消息并在 Activity 中使用保存的变量?我只找到 Toast.makeText 示例。 我实际拥有的是:正在工作的、已注册的 BroadcastReceiver。我的应用程序在 DocumentActivity 中运行,当我点击我的 DataCollectionTerminal 上的扫描按钮(android 7.0 上的 DTC)时,DTC 接收消息并为其吐司。我可以在打开的 EditText 中捕获来自 DTC 的消息并将其保存在单击保存按钮上。

但我需要的是:按下扫描按钮 => DTC 获取条形码消息 => 发送到 Activity 并将其保存到某个变量 => 我可以在整个 Activity 中使用这个 var.value,设置它 TextView,写它到txt文档等。

文档活动

class DocumentActivity : AppCompatActivity() 

private val customBroadcastReceiver = CustomBroadcastReceiver()

override fun onCreate(savedInstanceState: Bundle?) 
    super.onCreate(savedInstanceState)
    setContentView(exp..R.layout.activity_document)


override fun onResume() 

    super.onResume()
    registerReceiver(
        customBroadcastReceiver,
        IntentFilter ("com.xcheng.scanner.action.BARCODE_DECODING_BROADCAST")
    )


override fun onStop() 
    super.onStop()
    unregisterReceiver(customBroadcastReceiver)


fun saveMessage(mes: String)
    var code = mes
    Toast.makeText(applicationContext, code, Toast.LENGTH_SHORT).show()
    ...

广播接收器

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

    // Save mes, doesnt work
    DocumentActivity().saveCell(barcode)

【问题讨论】:

【参考方案1】:

您正在创建 DocumentActivity 的另一个对象并将值保存在该对象的变量中,因此它不会反映在当前对象中。尝试使变量静态,然后从广播接收器更新它。例如 DocumentActivity 中的变量是 barCodeVal 所以,

在文档活动中

companion object
  var barcodeVal = //some default value

然后从广播接收者

DocumentActivity.barcodeVal = barcode

【讨论】:

感谢您的回答。我可以从 onReceive 调用一些函数吗?我的意思是每次收到消息时,我都需要运行一些函数来检查barcodeVal并将其写入文本文件。 我从以下位置找到答案:***.com/a/22241844/8315239 创建第二个 BCReceiver 并从第一个捕获 BCmessage 是的,使该函数静态(写入伴随对象块内)。如果您认为答案有帮助,请接受它作为答案。当然,您也可以使用其他广播。

以上是关于如何从 BroadcastReceiver 在 Activity 中发送和保存字符串消息的主要内容,如果未能解决你的问题,请参考以下文章

将数据从 BroadCastReceiver 发送到正在运行的服务 (Android)

如何在 BroadcastReceiver 中添加 Snackbars?

如何使用新的导航架构组件从扩展 BroadcastReceiver 的类导航到片段

GCM 如何使用 BroadCastReceiver 处理应用程序

Android——BroadcastReceiver 广播 短信拦截

Android动态部署六:如何从插件apk中启动BroadcastReceiver和ContentProvider