暂停一个活动,同时另一个正在运行

时间:2015-02-03 14:53:51

标签: android multithreading sleep voice

我想用一种方法获得语音识别。

为了做到这一点,我创造了3个班级

主要班级

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));
            }
        });
    }
}

中间人

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;
    }
}

和识别一个

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();
    }
}

问题在于,当我使用VRecognition调用content.startActivity(intent);活动时,应用程序的执行继续进行,因此名为resultado的变量具有空值,直到onActivityResult为止执行,导致返回值为空。

希望你能帮助我。干杯

2 个答案:

答案 0 :(得分:2)

伊恩的回答很好。但是从你的评论中,我建议使用IntentService和BroadcastManager。这样你就不需要中间活动了。您从任何想要VR结果的活动中调用startService(intent)(并实现BroadcastReceiver)。然后IntentService调用startActivityForResult(intent,1)并广播结果。

更多信息: http://developer.android.com/training/run-background-service/index.html

答案 1 :(得分:0)

听起来你想暂停执行,直到语音识别完成。你可能想重新考虑一下;您正在从UI线程调用getComando(),因此您的应用程序UI将被冻结,直到识别完成。在识别时间超过五秒的(很可能)事件中,系统将弹出“应用程序无响应”对话框。 (此外,由于您通过在流程中启动其他活动来实施getComando(),因此阻止getComando()中的UI线程会阻止识别永久运行。)

执行此操作的正确方法是使用完成回调。例如,您可以创建一个IVRecognitionListener接口:

public interface IVRecognitionListener { public void onRecognitionComplete(String resultado); }

并将其实例传递给getComando()。然后,您可以调用IVRecognition.resultado来通知调用者结果,而不是仅在onActivityResult()中设置onRecognitionComplete()