【问题标题】:BroadcastReceiver call Service only once in loopBroadcastReceiver 在循环中只调用一次服务
【发布时间】:2012-08-14 23:25:13
【问题描述】:

这是我的 tts 服务代码:

public class SMSTTSService extends Service implements TextToSpeech.OnInitListener, OnUtteranceCompletedListener {

private TextToSpeech tts;
private String spokenText;

@Override
public void onCreate() {
    tts = new TextToSpeech(this, this);     
}

@Override
public void onInit(int status) {        
    if (status == TextToSpeech.SUCCESS) {
        int result = tts.setLanguage(Locale.ENGLISH);

        // tts.setPitch(5); // set pitch level
        // tts.setSpeechRate(2); // set speech speed rate

        if (result == TextToSpeech.LANG_MISSING_DATA || result == TextToSpeech.LANG_NOT_SUPPORTED) {
            Log.e("TTS", "Language is not supported");
        } else {                
            speakOut(spokenText);
        }

        /*if (result != TextToSpeech.LANG_MISSING_DATA && result != TextToSpeech.LANG_NOT_SUPPORTED) {
            tts.speak(c, TextToSpeech.QUEUE_FLUSH, null);
        }*/
    } else {
        Log.e("TTS", "Initilization Failed");
    }
}

private void speakOut(String text) {
    tts.speak(text, TextToSpeech.QUEUE_FLUSH, null);
}

@Override
public void onUtteranceCompleted(String uttId) {
    stopSelf();
}

@Override
public void onDestroy() {
    if (tts != null) {
        tts.stop();
        tts.shutdown();
    }
    super.onDestroy();
}

@Override
public IBinder onBind(Intent intent) {
    return null;
}       

@Override
public void onStart(Intent intent, int startId) {
    super.onStart(intent, startId);     
    spokenText = intent.getStringExtra("spoken_txt");
}

}

我从接收者那里调用服务

public class Receiver extends BroadcastReceiver {

    private static final String TAG = "SMSReceiver";

    @Override
    public void onReceive(Context context, Intent intent) {


for(int i=0; i<msgs.length; i++) {
....
 Intent intentTTS = new Intent(context, SMSTTSService.class);
                        intentTTS.putExtra("spoken_txt", msgBody);
                        context.startService(intentTTS);

}

但即使我有循环,服务也只会执行一次。如何让我在循环中不止一次有声音?我做错了什么?

【问题讨论】:

    标签: android


    【解决方案1】:

    我认为您想将 IntentService 类用于多个实例。

    参考这个:Multiple IntentService or one Service

    编辑:这是一个简单的示例,显示了有关 IntentService 的严格必要代码:

    public class ExampleIntentService extends IntentService {
         private static final String TAG = ExampleIntentService.class.getName();
    
         public ExampleIntentService() {
              super(TAG);
         }
    
         @Override
         protected void onHandleIntent(Intent intent) {
    
              // The code you want to execute
         }
    }
    

    为了启动服务,例如:

    Intent intent = new Intent(Intent.ACTION_SYNC, null, context, ExampleIntentService.class);
            intent.putExtra(ExampleIntentService.EXTRA_DATA, "some data");
            context.startService(intent);
    

    然后,在清单中添加:

    <service android:name="your.package.services.ExampleIntentService" />
    

    现在,如果您想了解更多详细信息并与 BroadcastReceiver 结合使用,我从 google 的第一个结果中找到了这些链接:

    【讨论】:

    • 除了服务还有其他选择吗?
    • IntentService 是一个服务,你以同样的方式启动,使用 context.startService(intent)。您只需对您的 SMSTTSService 类进行一些修改即可扩展 IntentService,我认为这没什么大不了的。
    • 感谢您更新代码,但 ExampleIntentService 类从未执行
    • 我刚刚进行了测试以确保一切正常。例如,如果我将 Log.d() 放在 onHandleIntent() 方法中,并使用 this.startService(intent) 从活动中启动服务,它会正确启动服务并打印我的日志。确保将服务添加到您的 Manifest.xml,并请查看我提供的示例链接,它们比我荒谬的小示例有用得多。我只是想向您介绍这个概念。
    • 谢谢你,我会再次测试,我也会再次阅读链接。
    【解决方案2】:

    您的onStart() 方法被多次调用,但它所做的只是将spokenText 变量设置为传递的额外变量。所有这一切都发生在说出第一个意图的时候。然后你关闭服务。

    您可能想要做的是实现一个简单的队列。在onStart() 方法中提取额外内容并将spokenText 添加到队列中。然后开始处理队列(如果尚未处理)。

    处理队列时,删除队列中的第一个元素并开始说话。在onUtteranceCompleted() 方法中,删除队列中的第一个元素,如果有,开始说出那个元素。当队列中没有元素时,停止服务。

    应该可以。

    【讨论】:

    • 嗯,谢谢你,但是下次打电话给接收者怎么样。服务不再执行......
    猜你喜欢
    • 2020-03-17
    • 2014-07-25
    • 2014-08-06
    • 1970-01-01
    • 2015-09-28
    • 2016-01-09
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多