Search code examples
androidmultithreadingsleepvoice

pause an activity meanwhile another one is running


I would like to get voice recognition using just one method.

In order to do that i've created 3 classes

the main class

public class Index extends Activity {

    private Button boton;
    private EditText texto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_index);
        boton = (Button)findViewById(R.id.boton);
        texto = (EditText) findViewById(R.id.texto);
        boton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View arg0) {
                texto.setText(IVRecognition.getInstancia().getComando(Index.this));
            }
        });
    }
}

the intermediate

public class IVRecognition {

    //*******************singleton********************

    private static IVRecognition instancia;

    private IVRecognition (){}

    public static IVRecognition getInstancia(){
        if (instancia==null) instancia = new IVRecognition();
        return instancia;
    }

    //************************************************

    public static String resultado = null;

    public String getComando(Context content){
        Intent intent = new Intent(content, VRecognition.class);
        content.startActivity(intent);

        //pause here untill VRecognition.onActivityResult is executed

        return resultado;
    }
}

and the recognition one

public class VRecognition extends Activity {

    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        startRecognition();
    }

    public void startRecognition (){
        Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH);
        intent.putExtra(RecognizerIntent.EXTRA_LANGUAGE_MODEL,RecognizerIntent.LANGUAGE_MODEL_FREE_FORM);
        intent.putExtra(RecognizerIntent.EXTRA_CALLING_PACKAGE,this.getPackageName());
        startActivityForResult(intent, 1 /*VOICE_RECOGNITION_REQUEST_CODE*/);

    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(requestCode == 1 /*VOICE_RECOGNITION_REQUEST_CODE*/ && resultCode == RESULT_OK){
            ArrayList<String> result = data.getStringArrayListExtra(RecognizerIntent.EXTRA_RESULTS);
            IVRecognition.getInstancia().resultado = result.get(0);
        }
        this.finish();
    }
}

The problem is that when I call VRecognition activity using content.startActivity(intent); the execution of the aplication keeps on going, so the variable called resultado has null value until onActivityResult is executed, which results in a null return value.

Hope you can help me. Cheers


Solution

  • Ian's answer is good. But from your comment, I'd recommend using an IntentService and the BroadcastManager. That way you don't need the intermediate activity. You call the startService(intent) from any activity that wants the VR result (and implements BroadcastReceiver). Then the IntentService calls startActivityForResult(intent,1) and Broadcasts the result.

    More info: http://developer.android.com/training/run-background-service/index.html