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

时间:2015-06-17 18:04:57

标签: android sms

所以我有这个非常简单的应用程序。它将加密的SMS消息发送到指定的电话号码。它工作膨胀,但我遇到问题,找到一种方法使收到的消息自动显示在消息日志中。我当前有一个“刷新”按钮,如果有新消息可以更新消息日志。我不想使用刷新按钮,我希望消息只是在收到时显示。

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

我在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;



        }
    }
}

因此,在我的主要活动中,我设置了刷新按钮以检查decrypted的长度。如果长度为decrypted&gt; 0然后我获取decrypted的内容并将其显示在消息日志中。

1 个答案:

答案 0 :(得分:1)

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

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

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

     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);