如何停止多次接收相同的短信?

Posted

技术标签:

【中文标题】如何停止多次接收相同的短信?【英文标题】:How to stop receiving same SMS multiple times? 【发布时间】:2016-08-08 11:14:29 【问题描述】:

我在一个消息应用程序中构建了以下 Receiver 类,它可以随时接收 SMS 消息:

public class Receiver extends BroadcastReceiver 
    public void onReceive(Context context, Intent intent) 
        Bundle extras = intent.getExtras();
        SmsMessage[] smgs = null;
        String infoSender = "";
        String infoSMS = "";

        if (extras != null) 
            // Retrieve the sms message received
            Object[] pdus = (Object[]) extras.get("pdus");
            smgs = new SmsMessage[pdus.length];

            for (int i = 0; i < smgs.length; i++) 
                smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                infoSender += smgs[i].getOriginatingAddress();
                infoSMS += smgs[i].getMessageBody().toString();
            
        
    

它的问题是它有时会多次收到相同的消息,所以我怀疑这是因为接收者没有取消注册和销毁,因此它过于频繁地检查传入的消息。

因此,我尝试实现这个典型的接收器类:

public class myReceiver extends MainActivity 
    BroadcastReceiver ReceiverOne = null;

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);

        IntentFilter filter = new IntentFilter("android.provider.Telephony.SMS_RECEIVED");
        ReceiverOne = new BroadcastReceiver() 
            @Override
            public void onReceive(Context arr0, Intent arr1) 
                processReceive(arr0, arr1);
            
        ;
        registerReceiver(ReceiverOne, filter);
    

    protected void onDestroy()
        super.onDestroy();
        unregisterReceiver(ReceiverOne);
    

但现在,ReceiverOne 从未使用过,因为此类没有布局,因此从未调用过。有没有办法把这两个接收器结合起来?

或者更好的是,关于为什么第一个接收者多次收到一些 SMS 消息,有人有什么更好的建议吗?

【问题讨论】:

【参考方案1】:

这是您的解决方案 获取消息并将其添加到 StringBuilder 以明确为什么您一次又一次地收到 getOriginatingAddress 对于所有短信部分都是一样的。

public class Receiver extends BroadcastReceiver 
        public void onReceive(Context context, Intent intent) 

        if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) 
            Bundle extras = intent.getExtras();
            SmsMessage[] smgs = null;
            String infoSender = "";
            String infoSMS = "";

            if (extras != null) 
                // Retrieve the sms message received
                Object[] pdus = (Object[]) extras.get("pdus");
                smgs = new SmsMessage[pdus.length];

                StringBuilder sb = new StringBuilder();
                for (int i = 0; i < smgs.length; i++) 

                    smgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                    sb.append(smgs[i].getMessageBody());

                
                infoSender = smgs[0].getOriginatingAddress();
                infoSMS = sb.toString();
            
         
       
    

【讨论】:

恐怕没有 - 它仍然收到多次。 @BlackHedgehog 检查更新的答案我添加了一个新检查..if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) @BlackHedgehog 你的问题解决了吗? 不,我不知道。您认为问题是什么? @BlackHedgehog 你的问题几乎解决了你错过了什么。

以上是关于如何停止多次接收相同的短信?的主要内容,如果未能解决你的问题,请参考以下文章

如何阻止SmsReceiver?

停止 SQL 在 JOIN 中两次返回相同的结果

Arduino Mega 2560 - 成功执行多次后在 while 循环中停止代码执行

强制停止会使应用程序的接收器不被调用?

Gmail 自动回复脚本 - 如何停止多次回复?

一个android应用多次登录出现多个进程的问题??