Использование sendBroadcast с намерением выполнить действие "android .rfid.INPUT" - PullRequest
0 голосов
/ 25 марта 2020

Я новичок в Android разработке и пытаюсь отладить и понять приложение, которое работает на Android для сканирования штрих-кодов. Пожалуйста, см. SotfScanService. java для полного исходного кода.

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

  1. Может кто-нибудь объяснить, что происходит, когда sendBroadcast() выполняется ниже?
  2. Является ли android.rfid.INPUT стандартным действием, которое понимают другие приложения?

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

SotfScanService. java:

private void sendToInput(String data , boolean enterFlag){
    String result = getfixChar(data);


    String append = getAppendChar();
    switch (append) {
        case "1":
            enterFlag = true ;
            break ;
        case "2":
            result += "\n";
            break ;
        case "3":
            result += "\t";
            break ;
        case "4":

            break ;
    }

    Intent toBack = new Intent() ;
    toBack.setAction("android.rfid.INPUT") ;
    toBack.putExtra("data", result );//发送添加前缀后缀的数据
    toBack.putExtra("enter", enterFlag) ;
    sendBroadcast(toBack) ;
}

1 Ответ

2 голосов
/ 29 марта 2020
  1. sendBroadcast

    Прежде чем перейти к sendBroadcast, нам сначала нужно узнать, что такое Broadcast . Приложения Android могут отправлять или получать широковещательные сообщения из системы Android и других приложений Android, аналогично шаблону разработки publi sh -подписки. Эти трансляции отправляются, когда происходит интересующее событие. Например, система Android отправляет широковещательные сообщения, когда происходят различные системные события, например, когда система загружается или устройство начинает заряжаться. Приложения также могут отправлять пользовательские трансляции, например, для уведомления других приложений о том, что может их заинтересовать (например, загружены некоторые новые данные).

    Из репозитория кода GitHub я примерно Прошло от начала до конца, это похоже на приложение для автоматизации, которое включает в себя сканирование чего-либо (RFID? штрих-код?). Я закомментировал процесс до этого метода, а также после этого метода, детали следующие:

    private void sendToInput(String data , boolean enterFlag){
    
        //getfixChar(data): It gets and processes data which stored in SharedPreferences Strings, 
        //namely prefix_config and suffix_config. 
        //The return value will be the data with prefix and suffix (prefix + data + suffix)
        String result = getfixChar(data);
    
        //getAppendChar(): It get the String stored in SharedPreference, which is append_ending_char, with default value 4.
        //If there's no value stored in append_ending_char, it will return 4, and otherwise (1, 2, or 3)
        String append = getAppendChar();
        switch (append) {
            case "1":
                enterFlag = true ;
                break ;
            case "2":
                result += "\n";
                break ;
            case "3":
                result += "\t";
                break ;
            case "4":
    
                break ;
        }
        //After getting and processing all the values and stored in result and append respectively.
        //The values are stored in the Intent extra, namely data and enter.
        //It will be send via Broadcast
        Intent toBack = new Intent() ;
        toBack.setAction("android.rfid.INPUT") ;
        toBack.putExtra("data", result ) ;//发送添加前缀后缀的数据 //Translation: Sending data with prefix and suffix added
        toBack.putExtra("enter", enterFlag) ;
        sendBroadcast(toBack) ;
    }
    
  2. android.rfid.INPUT

    Автор просто назвал его таким образом, другие приложения не узнают об этом, если только другое приложение не получит такую ​​же трансляцию с точным названием android.rfid.INPUT. широковещательные рассылки могут использоваться в качестве системы обмена сообщениями между приложениями и вне обычного пользовательского потока, который разработчик намеревается получить широковещательную рассылку, отправленную методом ScanBroadcast. без применения кода, и, просто изучая поток, я думаю, что это своего рода метод автоматизации, в зависимости от результата, полученного от намерения, упомянутого до этого.

  3. Последнее, но Не в последнюю очередь, я бы предложил вам распечатать все значения в logcat (отладочная консоль / терминал), чтобы вы могли знать, какая часть работает неправильно.

    Например:

    private void sendToInput(String data , boolean enterFlag){
        String result = getfixChar(data);
        Log.d("result", result);
    
        String append = getAppendChar();
        Log.d("append", append);
        switch (append) {
            case "1":
                enterFlag = true ;
                break ;
            case "2":
                result += "\n";
                break ;
            case "3":
                result += "\t";
                break ;
            case "4":
    
                break ;
        }
        //Last but not least, double check here.
        Log.d("result2", result);
        Log.d("enterFlag", enterFlag);
        Intent toBack = new Intent() ;
        toBack.setAction("android.rfid.INPUT") ;
        toBack.putExtra("data", result );//发送添加前缀后缀的数据
        toBack.putExtra("enter", enterFlag.toString()) ;
        sendBroadcast(toBack) ;
    }
    

    Как вы, возможно, знаете, у меня нет как устройства ввода, так и объектов сканирования данных, так что это самое дальнее, чем я могу помочь.

...