2015-06-17 32 views
0

所以我有這個非常簡單的應用程序。它將加密的SMS消息發送到指定的電話號碼。它的工作方式很好,但我遇到的問題是找到一種方法讓接收到的消息自動顯示在消息日誌中。如果有新消息可用,我正確地有一個「刷新」按鈕來更新消息日誌。我不想使用刷新按鈕,我希望消息在收到時簡單顯示。如何在Android SMS應用程序中收到消息時自動顯示消息?

應用程序的工作方式是,它需要從文本框發送消息並加密它。然後它發送消息並在收到時解密並存儲在變量中並顯示在消息日誌中(在按「刷新」之後)。

我已經在谷歌上嘗試了很多搜索,但找不到有用的東西,因爲這些詞太有道理。我通常會找到不能接收消息的人的鏈接,或者只是鏈接下載消息應用程序。

這是我的一些代碼。這是接收短信部分。

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> 0,則我將decrypted的內容顯示在消息日誌中。

回答

1

有多種方法可以做到這一點。簡單的方法是使用每秒在MainActivity中運行的TimerTask來檢查'解密'變量的長度。 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); 
+1

處理程序對象像魅力一樣工作。多謝了朋友。 – Restnom

相關問題