SMS Broadcastreceiver - 开始后更新主要活动变量

时间:2014-08-13 20:11:59

标签: android sms broadcastreceiver

我有一个短信广播接收器,它会在传入短信时向用户读出文本。当应用程序正在阅读第一个文本时收到另一个文本时会出现问题。因此,为了防止多个sms进入,我想在主活动中设置一个标志,表明它正在读取文本并取消新的短信接收器。关于如何做到这一点的任何想法?

1 个答案:

答案 0 :(得分:0)

你使用文字转语音引擎吗? ..如果只是打电话给tts.stop

此处来自TTS android Docs

stop()
Interrupts the current utterance (whether played or rendered to file) and discards other utterances in the queue.
呼叫停止后,继续播放您的新演讲。

更新:另一种选择,只是检查引擎是否已经在说话,如果是,那么就不要做任何事情 。 来自文档:

isSpeaking()
Checks whether the TTS engine is busy speaking.

更新: 你需要传递你提出数据标志的意图,告诉其他新的活动是什么

所以,如果你打算一个明确的意图来启动一个类,你可能会这样调用它(用你提到的启动标志):

Intent intent = new Intent(context,MyActivity.class); startActivity(意向);

用它传递一个额外的标志:

Intent intent = new Intent(context, MyActivity.class);
intent.putExtra("isSpeaking", tts.isSpeaking());
startActivity(intent)

然后在onCreate的已启动活动中,只需读取意图中的数据:

Intent i = getIntent();

Bundle extras = i.getExtras();

boolean flag= extras.getBoolean("isSpeaking");

如果不起作用,那么只需在活动中使用静态标志即可。我不确定它的线程是否安全所以我也会在这里使用volatile,但像static volatile boolean isSpeaking;

这样的东西

更新:我会删除你在启动意图上的标志(即Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP),然后在活动覆盖onNewIntent()中,并检查一个布尔标志。以我上面描述的相同方式启动intent,在bundle中发送一个布尔额外标志。

@Override
    protected void onNewIntent(Intent intent) 
    {
        super.onNewIntent(intent);
        if(intent.getBooleanExtra("isSpeaking",false))
        {
            //do some things  here like ignore speaking or stop TTS etc
        }
    }