如何让 Android SMS 应用收到消息时自动显示?

How to make messages show up automatically when recieved in Android SMS app?

所以我有了这个非常简单的应用程序。它将加密的 SMS 消息发送到指定的 phone 号码。它运行良好,但我在寻找一种方法使收到的消息自动显示在消息日志中时遇到问题。我现在有一个 "refresh" 按钮,如果有新消息可用,它会更新消息日志。我不想使用刷新按钮,我希望消息在收到时直接显示。

该应用程序的工作方式是,它从文本框中获取要发送的消息并对其进行加密。然后它发送消息,当收到消息时,它解密并存储在一个变量中并显示在消息日志中(在我按 "refresh" 之后)。

我在 google 上尝试了很多搜索,但找不到有用的东西,因为这些词太敏感了。我通常会找到无法接收消息的人的链接,或者只是下载消息应用程序的链接。

这是我的一些代码。这是接收短信的部分。

public class SmsReceiver extends BroadcastReceiver
{    
    public static String decrypted = "";

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

        //---get the SMS message passed in---
        Bundle bundle = intent.getExtras();
        SmsMessage[] msgs = null;
        String str ="";
        String info = "";


        if (bundle != null)
        {


            //---retrieve the SMS message received---
            Object[] pdus = (Object[]) bundle.get("pdus");
            msgs = new SmsMessage[pdus.length];
            for (int i=0; i<msgs.length; i++){
                msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
                info += "SMS from " + msgs[i].getOriginatingAddress();
                info += " : ";
                str += msgs[i].getMessageBody().toString();

                if (i==msgs.length-1 && MainActivity.locked == true){

                    try {
                        decrypted = AESHelper.decrypt(MainActivity.seed, str);
                    } catch (Exception e) {
                        e.printStackTrace();
                    }

                    MainActivity.rand = Math.random();
                    MainActivity.seed = String.valueOf(MainActivity.rand);

                    decrypted = info + decrypted;
                    info = "";
                    MainActivity.locked = false;



        }
    }
}

因此,在我的主 activity 中,我将刷新按钮设置为检查 decrypted 的长度。如果 decrypted 的长度 > 0,那么我将获取 decrypted 的内容并将它们显示在消息日志中。

有多种方法可以做到这一点。简单的方法是在 MainActivity 中使用每秒 运行s 的 TimerTask 来检查 'decrypted' 变量的长度。 Timertask 不在 ui 线程上 运行。但是由于您仅使用它来检查变量的长度,因此应该没问题。如果您需要有关 timertask 的帮助,请使用下面的示例:

     Timer timer = new Timer();
     timer.scheduleAtFixedRate(new SpecificTask(), 1000, 200);

但是你必须定义你的 SpecificTask() class...

     private Specific Task extends TimerTask{
         @Override
    public void run() {

                if(decrypted.length()>0){
                 //do refresh here but make sure you run this code onuithread
                  //just use runonuithread... 
                  }

            }

       }

或者您可以只使用处理程序对象...

      boolean mStopHandler = false;
      Handler handler = new Handler();

     Runnable runnable = new Runnable() {
     @Override
     public void run() {
     if (!mStopHandler) {
        if(decrypted.length()>0){
               //refreshlayout code
        }
        handler.postDelayed(this, 500);
       }
     }
   };

       // start your handler  with:
        handler.post(runnable);