Как получить сообщения из службы в Android-котировке AlertDialog - PullRequest
0 голосов
/ 20 сентября 2019

Я реализовал программу сканирования штрих-кодов, которая захватывает штрих-коды из службы сканирования штрих-кодов.В этой программе я иногда открываю диалоговое окно с полем editText для получения дополнительной информации, я хотел бы знать, как я могу получить службу для отправки штрих-кода в этот alertDialog.

Когда этот alertDialog закрыт, штрих-код должензатем снова отправляются в открытое действие.

Вот как я могу отправить / получить сообщения

class SomeActivity : AppCompatActivity() {

/* variables to communicate with scanning services */
    private var mService: Messenger? = null
    private var mBound: Boolean = false
    private val mMessenger: Messenger = Messenger(IncomingHandler(this))

/* service connection which binds to the scanning SDK for IPC */
    private val connection: ServiceConnection = object: ServiceConnection {
        override fun onServiceConnected(name: ComponentName?, service: IBinder?) {
            /* connect to service*/
            mService = Messenger(service)
            /* Register to the scanner */
            val msg: Message = Message.obtain(null, MSG_REGISTER)
            msg.replyTo = mMessenger
            mService?.send(msg)

        }

        override fun onServiceDisconnected(name: ComponentName?) {
            /* In the case of unexpected disconnection */
            mService = null
        }
    }

    /* Handles inbound IPC messages and figures out what to do with them */
    inner class IncomingHandler(
        context: Context
    ) : Handler() {
        override fun handleMessage(msg: Message){
            when(msg.what) {
                MSG_BARCODE ->{
                    val bcodeBundle = msg.data
                    val bcodeData = bcodeBundle.getString("barcode")
                    val bcodeType = bcodeBundle.getString("type")
                    barcodeScanned(bcodeData!!,bcodeType!!)
                }
                else ->
                    super.handleMessage(msg)
            }
        }
    }

в другом месте действия

Сообщениефункция создания

private fun getMsg(msgCode: Int) : Message{
        val msg: Message = Message.obtain(null, msgCode)
        msg.replyTo = mMessenger
        return msg
    }

Пример отправки сообщения

val newmsg: Message = Message.obtain(null, MSG_REBARCODE, 0, 0)
            val bundle = Bundle()
            bundle.putString("barcode",dialog.manualBarcode)
            bundle.putString("type","MANUAL")
            newmsg.data = bundle
            mService?.send(newmsg)

Привязка к сервису

if (!mBound){
            mBound = bindScanner(this,versionSDK, connection)
            mBound = true
            mService?.send(getMsg(MSG_START))
        }

Отвязка

unbindService(connection)

ПользовательскийAlertDialog вызов в рамках действия

val dialog = CustomDialog(variousVariables...)
dialog.show()

, как создается пользовательский диалог

class CustomDialog (val theContext: Context, other data...)
    : AlertDialog(theContext) {

init{
        requestWindowFeature(Window.FEATURE_NO_TITLE)
        setCancelable(false)
    }

override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        val window = this.window
        val display = theActivity.windowManager.defaultDisplay
        val size = Point()
        display.getSize(size)
        val width = size.x
        val height = size.y
        window?.setLayout(width,(height/96)*100)
        setContentView(R.layout.dialog_enter_additional_data)
        this.window?.clearFlags(WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE)
        this.window?.clearFlags(WindowManager.LayoutParams.FLAG_ALT_FOCUSABLE_IM)
        this.window?.setSoftInputMode(
            WindowManager.LayoutParams.SOFT_INPUT_ADJUST_PAN)

//Etc...
}

1 Ответ

0 голосов
/ 20 сентября 2019

Понял это

Из моей Активности Я передаю значения моего мессенджера моему Диалогу

val dialog = CustomDialog(mService, mMessenger, variousVariables...)
dialog.show()

В моем Классе AlertDialog Я создал новый дескриптор мессенджера и применил его к новой переменной мессенджера

private val newMessenger: Messenger = Messenger(IncomingHandler())

/* Handles inbound IPC messages and figures out what to do with them */
    inner class IncomingHandler(
    ) : Handler() {
        override fun handleMessage(msg: Message){
            when(msg.what) {
                MSG_BARCODE ->{
                    val bcodeBundle = msg.data
                    val bcodeData = bcodeBundle.getString("barcode")
                    dataInput?.setText(bcodeData)
                    capturedData = bcodeData!!
                }
                else ->
                    super.handleMessage(msg)
            }
        }
    }

. Затем я регистрировал нового мессенджера в своем сервисе, используя уже построенный мессенджер

override fun onCreate(savedInstanceState: Bundle?) {
//Code...

val msg: Message = Message.obtain(null, MSG_REGISTER)
        msg.replyTo = newMessenger
        mService?.send(msg)

//Code...
}

.с моим alertDialog (то есть когда он закрывается), я возвращаю активность его мессенджеру

/* Somewhere in the code */
val msg: Message = Message.obtain(null, MSG_REGISTER)
            msg1.replyTo = mMessenger
            service?.send(msg)
...