Как получить результат от OnActivityResult внутри другого класса? (За пределами действия

Я запускаю активность распознавания голоса в классе non activity (путем передачи в операции) вот код:

private static void startVoiceRecognitionActivity() {
        // TODO Auto-generated method stub
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Talk");
                myActivity.startActivityForResult(intent, REQUEST_CODE);
    }

Последняя строка myActivity - это активность, которую я передал классу, у которого есть этот метод.

protected void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    for (final EditText editText : editTextHandlingList) {
        if (requestCode == REQUEST_CODE && resultCode == theActivity.RESULT_OK) {
            ArrayList<String> results = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
                        //log the result            }
    }
}

Теперь проблема заключается в методе onActivityResult. Я хочу, чтобы вернуть результат обратно в один класс, а не в работу. Если это смутно, задайте мне вопросы..

Как я передаю активность этому классу, есть ли способ, которым я могу это сделать? Должен быть какой-то способ справиться с этим снаружи. Если у вас есть вопросы, спросите меня.

Ответ 1

I want to be able to get the result back inside the same class and not 
in the activity.

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

Решение:

Поскольку у вас есть myActivity в вашем другом классе, вы можете использовать Intent, чтобы получить результат от другого действия в вашем классе, где вы запустили VoiceRecognition. Также убедитесь, что вы вызываете его после завершения операции VoiceRecognition.

Пример:

myActivity.getIntent().getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);

Ответ 2

Если я понимаю вопрос, вы пытаетесь сделать что-то вроде этого:

Иногда полезно создать класс утилиты, который инкапсулирует собственный код (в данном случае связанный с голосом). Класс утилиты - это всего лишь куча методов static:

public static class VoiceRecognitionUtils {

    private static void startVoiceRecognitionActivity(Activity myActivity) {
        // TODO Auto-generated method stub
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,
                RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_PROMPT,
                "Talk");
                myActivity.startActivityForResult(intent, REQUEST_CODE);
    }

    private static void processResult(int requestCode, int resultCode, Intent data) {
        for (final EditText editText : editTextHandlingList) {
            if (requestCode == REQUEST_CODE && resultCode == RESULT_OK) {
                ArrayList<String> results = data
                    .getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            }
        }
    }
}

Учитывая этот класс, ваша деятельность может просто вызвать статические методы из соответствующих событий жизненного цикла:

public class MainActivity extends FragmentActivity {
    // ...

    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        VoiceRecognitionUtils.processResult(requestCode, resultCode, data);
    }

    // call startVoiceRecognitionActivity() somewhere

}

Функция распознавания голоса все еще запущена, и результаты, полученные с помощью Activity (потому что Android OS требует этого), но технические данные собираются в классе утилиты.

Я не уверен в вашем вопросе, если это то, что вы пытались сделать, но я бы рекомендовал эту технику в любом случае, это очень полезно.