2
回答
关于android用广播接收短信的问题
利用AWS快速构建适用于生产的无服务器应用程序,免费试用12个月>>>   

我使用的broadcastreceiver是会不断循环的,并且在接受到多个广播(只有第一个广播能够完成)的时候会阻塞。

这个是我注释掉所有主要操作后的一个broadcastreceiver

 

这个broadcastreceiver用于接收系统收到短信后自动发送的广播通知。

我本来认为应该只会运行输出一个“I have received a short message!”,但运行的结果却是这样的:

 

Logcat中连续出现了两次“I have received a short message!”。我不明白为什么会有连续两次的输出。

而如果我在onReceive函数里面加入如下语句:

 

Logcat中输出的结果就会变成如下:

 

出现这样的问题之后这个broadcastreceiver就无法再接收到广播了。这个错误我一直不太明白是什么意思。

我本来以为是阻塞了主线程,于是我尝试把代码改成这样:

 

但是结果还是没有区别,问题还是没有能够解决~

上面是这个问题会发生的情况,而下面是这个问题不会发生的情况:

我用的是commons-email-1.2包中封装好的发送邮件的方法,当我用SimpleEmail.send()方法发送邮件之后,上面的一系列情况就不会产生,broadcastreceiver只会收到一次广播,并且可以一直接受到广播,也就是说上面的问题会完全解决掉。但是很可惜我并没有弄明白原因,以至于在其他情况下我没有办法解决这个错误。

 希望各路大神帮忙解答!谢谢啦!!

举报
Garyly
发帖于3年前 2回/1K+阅
共有2个答案 最后回答: 3年前
有没有大神可以帮忙解答一下~~~这个问题真的困扰的我很厉害。要是我没能说清楚问题的话可以跟我说啊。谢谢大家!

输出两次“I have received a short message!”是因为你在AndroidManifest.xml中注册receiver:

    <receiver android:name=".SMSBroadcastReceiver">

            <intent-filter android:priority="1000">
                <action android:name="android.provider.Telephony.SMS_RECEIVED" />
            </intent-filter>
        </receiver>

然后你在代码中也动态注册了:

        mSMSBroadcastReceiver = new SMSBroadcastReceiver();
        实例化过滤器并设置要过滤的广播
        IntentFilter intentFilter = new IntentFilter(ACTION);
        intentFilter.setPriority(Integer.MAX_VALUE);
        //注册广播
        this.registerReceiver(mSMSBroadcastReceiver, intentFilter);

改成:

        mSMSBroadcastReceiver = new SMSBroadcastReceiver();
        //实例化过滤器并设置要过滤的广播
        //IntentFilter intentFilter = new IntentFilter(ACTION);
        //intentFilter.setPriority(Integer.MAX_VALUE);
        //注册广播
        //this.registerReceiver(mSMSBroadcastReceiver, intentFilter);
就可以了

顶部