暂停 activity 同时另一个 运行
pause an activity meanwhile another one is running
我想只使用一种方法进行语音识别。
为了做到这一点,我创建了 3 classes
主要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));
}
});
}
}
中级
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();
}
}
问题是,当我使用 content.startActivity(intent);
调用 VRecognition
activity 时,应用程序的执行继续进行,因此名为 resultado
的变量具有空值,直到onActivityResult
被执行,结果为空 return 值。
希望你能帮助我。干杯
听起来你想暂停执行,直到语音识别完成。您可能需要重新考虑一下;您正在从 UI 线程调用 getComando()
,因此您的应用程序 UI 将被冻结,直到识别完成。在(很可能)识别时间超过五秒的情况下,系统将弹出应用程序无响应对话框。 (此外,由于您通过在您的进程中启动另一个 activity 来实现 getComando()
,因此阻塞 getComando()
中的 UI 线程将阻止 运行 的识别。 )
正确的方法是使用完成回调。例如,您可以创建一个 IVRecognitionListener 接口:
public interface IVRecognitionListener {
public void onRecognitionComplete(String resultado);
}
并将其实例传递给 getComando()
。然后,除了在 onActivityResult()
中设置 IVRecognition.resultado
,您还可以调用 onRecognitionComplete()
来通知调用者结果。
伊恩的回答很好。但根据您的评论,我建议使用 IntentService 和 BroadcastManager。这样你就不需要中间 activity。您从任何需要 VR 结果(并实现 BroadcastReceiver)的 activity 调用 startService(intent)
。然后 IntentService 调用 startActivityForResult(intent,1)
并广播结果。
更多信息:
http://developer.android.com/training/run-background-service/index.html
我想只使用一种方法进行语音识别。
为了做到这一点,我创建了 3 classes
主要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));
}
});
}
}
中级
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();
}
}
问题是,当我使用 content.startActivity(intent);
调用 VRecognition
activity 时,应用程序的执行继续进行,因此名为 resultado
的变量具有空值,直到onActivityResult
被执行,结果为空 return 值。
希望你能帮助我。干杯
听起来你想暂停执行,直到语音识别完成。您可能需要重新考虑一下;您正在从 UI 线程调用 getComando()
,因此您的应用程序 UI 将被冻结,直到识别完成。在(很可能)识别时间超过五秒的情况下,系统将弹出应用程序无响应对话框。 (此外,由于您通过在您的进程中启动另一个 activity 来实现 getComando()
,因此阻塞 getComando()
中的 UI 线程将阻止 运行 的识别。 )
正确的方法是使用完成回调。例如,您可以创建一个 IVRecognitionListener 接口:
public interface IVRecognitionListener {
public void onRecognitionComplete(String resultado);
}
并将其实例传递给 getComando()
。然后,除了在 onActivityResult()
中设置 IVRecognition.resultado
,您还可以调用 onRecognitionComplete()
来通知调用者结果。
伊恩的回答很好。但根据您的评论,我建议使用 IntentService 和 BroadcastManager。这样你就不需要中间 activity。您从任何需要 VR 结果(并实现 BroadcastReceiver)的 activity 调用 startService(intent)
。然后 IntentService 调用 startActivityForResult(intent,1)
并广播结果。
更多信息: http://developer.android.com/training/run-background-service/index.html