Android中的TTS和Singleton
我有一个应用程序大量使用TTS。它工作得很好,但我需要调整它 我在每个屏幕上都使用TTS对象,这不好。我希望我能只创建一次TTS对象(像一个单例对象),并在我的所有活动中使用它 以下是此操作的基本代码:Android中的TTS和Singleton,android,singleton,text-to-speech,Android,Singleton,Text To Speech,我有一个应用程序大量使用TTS。它工作得很好,但我需要调整它 我在每个屏幕上都使用TTS对象,这不好。我希望我能只创建一次TTS对象(像一个单例对象),并在我的所有活动中使用它 以下是此操作的基本代码: public class SimOuNaoActivity extends Activity implements OnInitListener{ public TextToSpeech tts; private int MY_DATA_CHECK_CODE =
public class SimOuNaoActivity extends Activity implements OnInitListener{
public TextToSpeech tts;
private int MY_DATA_CHECK_CODE = 0;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Intent checkIntent = new Intent();
checkIntent.setAction(TextToSpeech.Engine.ACTION_CHECK_TTS_DATA);
startActivityForResult(checkIntent, MY_DATA_CHECK_CODE);
tts.speak("Testing 1,2,3", TextToSpeech.QUEUE_ADD, null);
}
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
if (requestCode == MY_DATA_CHECK_CODE) {
if (resultCode == TextToSpeech.Engine.CHECK_VOICE_DATA_PASS) {
tts = new TextToSpeech(this, this);
} else {
// missing data, install it
Intent installIntent = new Intent();
installIntent
.setAction(TextToSpeech.Engine.ACTION_INSTALL_TTS_DATA);
startActivity(installIntent);
}
}
}
@Override
public void onInit(int status) {
if (status == TextToSpeech.SUCCESS) {
// Toast.LENGTH_LONG).show();
} else if (status == TextToSpeech.ERROR) {
// Toast.LENGTH_LONG).show();
}
}
@Override
public void onDestroy() {
if (tts != null) {
tts.stop();
tts.shutdown();
}
super.onDestroy();
System.gc();
}
}
在我的所有活动中使用TTS对象的正确方法是什么?请记住,它使用了一些方法,如startActivityForResult等。。。所以我想知道我能做些什么使这项工作顺利进行
有人能帮我吗
感谢您的帮助
谢谢 看看这里,在安卓系统中以更好的设计在活动和程序之间共享内容:
您可能希望在应用程序中实例化并保存Singleton对象,但无论如何只能实例化一次,因此只需将TTS初始化代码放在自己的类中,并在应用程序中将该类实例化为对象即可。您需要将应用程序作为TTS将被实例化的上下文传递给TTS类
public class MyApplication extends Application {
public MyTTS myTTS;
public void onCreate() {
myTTS = new MyTTS(this);
}
}
然后,您可以从Activities中使用getApplication().myTTS.whateverMethodsYouMake(yadayada)访问应用程序单例化TTS类。这相对简单-只需按如下方式实现,不要忘记将应用程序上下文(
This.getApplicationContext()
)作为上下文传递而不是活动上下文
public class SingletonTTS {
private static SingletonTTS instance;
private static Context ctx;
private TextToSpeech mTTS;
private static boolean TTSready = false;
private SingletonTTS(Context context) {
ctx = context;
mTTS = new TextToSpeech(context, new TextToSpeech.OnInitListener() {
@Override
public void onInit(int i) {
TTSready = true;
configTTS();
}
});
}
public static synchronized SingletonTTS getInstance(Context context) {
if (instance == null) {
instance = new SingletonTTS(context);
}
return instance;
}
public static boolean isTTSready(){
return TTSready;
}
private void configTTS() {
Toast.makeText(ctx, "supports " + mTTS.isLanguageAvailable(Locale.getDefault()), Toast.LENGTH_LONG).show();
int available = mTTS.isLanguageAvailable(Locale.getDefault());
if( available != TextToSpeech.LANG_MISSING_DATA
&& available != TextToSpeech.LANG_NOT_SUPPORTED ){
mTTS.setLanguage(new Locale(Locale.getDefault().getLanguage()) );
} else {
/** TODO SAVE */
}
}
public void speakSentence(String sentence){
mTTS.speak(sentence, TextToSpeech.QUEUE_ADD, null);
}
}那么,是什么阻止您将TextToSpeech对象设置为Singleton?在您的用例中,听起来是一件明智的事情。您可以在自己的应用程序子类中设置它,以便从所有活动中轻松访问它,或者,更方便的是,使用相关方法创建某种基本活动,从单例/应用程序委托调用TextToSpeech对象,并让所有其他活动扩展它。您好,MH,谢谢您的回答。有样本代码吗?我有点困在这里=别针而不是复制粘贴代码在这里,我建议你看看。可以找到另一个使用单例模式的TTS实现。请注意,在使用上并没有真正的共识。我将把决定权留给你。祝你好运应用程序上下文和活动上下文是完全相同的。这是因为
Activity
扩展了ContextWrapper
,后者是实现getApplicationContext
的类。它们都是上下文的实例,但应用程序实例与应用程序的生命周期相关联,而活动实例与活动的生命周期相关联。因此,他们可以访问有关应用程序环境的不同信息。是的,当然-我认为您应该编辑答案的最后一部分,以便更清楚地理解您的意思-“而不是活动上下文”->“而不是活动实例”