Как выполнить вложенную трансляцию, которая должна возвращать вложенные возвращенные результаты? - PullRequest
0 голосов
/ 24 мая 2019

Мое приложение имеет широковещательный приемник для определенного намерения (запускаемого системным приложением), для которого должен быть возвращен результат.Само по себе это не сложно.

Однако этот результат должен основываться на результате широковещательного намерения другого широковещательного приемника из другого приложения.Следовательно, вложенная последовательностьспособ вызвать это намерение из моего приложения в другое приложение до того, как мой получатель завершит обработку собственного полученного намерения.

Я много играл с потоками, обработчиками и тому подобным, но основная проблема заключается в том, чтоsendbroadcast выполняется основным циклом приложения, который ожидает, пока широковещательный приемник onReceive не выполнит свою задачу.

Пример кода - это скелет моего кода.Это показывает основы того, что мне нужно достичь.

@Override
public void onReceive(Context context, Intent intent) {

    final String action = intent.getAction();
    if (action.equals(CustomIntent.EDIT_DATA)) {

       // we nest the intent to the other app
       final Bundle resultBundle = new Bundle();
       final Intent editdataIntent = new Intent(action);
       editdataIntent.setComponent(ExplicitOtherAppComponent);
       editdataIntent.putExtras(intent.getExtras());

       final Object monitor = new Object();
       HandlerThread thread = new HandlerThread("BroadcastReceiverThread");
       thread.start();

       synchronized (monitor) {
           handlerContext.sendOrderedBroadcast(editdataIntent, null, new BroadcastReceiver() {
                        @Override
                        public void onReceive(Context context, Intent intent) {

                            Bundle results = getResultExtras(false);
                            String pluginBarcodeData = results.getString("data");
                            resultBundle.putString("data", pluginBarcodeData);

                            synchronized(monitor) {
                                monitor.notify();
                            }
                        }
            }, new Handler(thread.getLooper()), Activity.RESULT_OK, null, null);

             try {
                monitor.wait(1000); // timeout for receiving the result
             } catch (InterruptedException e) {
         }

      }
      thread.quit();

      final PendingResult result = goAsync();
      result.setResultExtras(resultBundle);
      result.setResultCode(1);
      result.finish();
   }
}

Как сделать так, чтобы трансляция отправлялась, а результат был получен до завершения собственного onReceive?Мое приложение должно возвращать результаты на основе информации из вложенного приложения.

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

...