2012-08-16 26 views
2

我是Android和Java的新手。以下代碼是發送並等待接收短信。由於該過程可能需要大約3分鐘,我需要一個progressDialog,直到收到SMS。你可以給我一個小程序來做到這一點?在等待接收短信時製作progressdialog

package com.examples.TOLD; 
import android.app.Activity; 
import android.os.Bundle; 
import android.content.Intent; 
import android.telephony.SmsManager; 
import android.util.Log; 
import android.widget.TextView; 

public class Sms extends Activity { 
/** Called when the activity is first created. */ 

static TextView smsReceive; 

@Override 
protected void onCreate(Bundle savedInstanceState) 
{  
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.sms); 

    Intent i = getIntent(); 
    // Receiving the Data 
    String reg = i.getStringExtra("reg"); 
    String port = i.getStringExtra("port"); 

    String smsMessage = 
     "REG=" + reg + 
     "PORT=" + port; 

    // Show SMS sent message on screen 
    TextView smsSend = (TextView) findViewById(R.id.smsSend); 
    smsSend.setText(smsMessage); 
    Log.i("smsSend",String.valueOf(smsSend.getText())); 
    // Send SMS message 
    SmsManager sm = SmsManager.getDefault(); 
    String number = "5556"; 
    sm.sendTextMessage(number, null, smsMessage, null, null); 

    // Receive SMS message 
    smsReceive = (TextView) findViewById(R.id.smsReceive); 

} 
public static void updateMessageBox(String msg) 
{ 
    smsReceive.append(msg); 
}  
} 

這裏是另一個類接收短信:

package com.examples.TOLD; 

import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.os.Bundle; 
import android.telephony.SmsMessage; 
import android.util.Log; 


public class SmsReceiver extends BroadcastReceiver{ 

public void onReceive(Context context, Intent intent) 
{ 
    Bundle bundle=intent.getExtras(); 

    Object[] messages=(Object[])bundle.get("pdus"); 
    SmsMessage[] sms = new SmsMessage[messages.length]; 

    for(int n=0;n<messages.length;n++){ 
     sms[n]=SmsMessage.createFromPdu((byte[]) messages[n]); 
    } 

    for(SmsMessage msg:sms){ 
     String num = msg.getOriginatingAddress(); 
     Log.i("SMS sender",num); 
     if (num.equals("15555215556")) { 
     Sms.updateMessageBox("\nFrom: " + msg.getOriginatingAddress() + 
       "\n" + "Message: " + msg.getMessageBody() + "\n");}   
    } 
} 
} 
+0

嘿你創建接收器來獲取短信,那麼爲什麼你需要進度對話?請閱讀這個---> http://developer.android.com/reference/android/content/BroadcastReceiver.html – 2012-08-16 08:36:50

+0

該應用程序正在發送短信,並等待該號碼回覆短信。這個過程需要一段時間。所以我需要一個進度對話框。不好意思,我不太明白你發送的鏈接。 – brompton 2012-08-16 09:05:32

回答

1

我認爲你可以嘗試重新考慮你的方法。你不能指望用戶將等待長達3分鐘的短信。因此,你的代碼看起來是正確的(除了靜態方法的一部分,我稍後解釋你),但是一旦你的消息被髮送,我會顯示一條消息,你的應用程序正在等待消息,並且當消息在SmsReceiver,您可以與Sms活動溝通。

,你不應該使用靜態方法來更新活動的內容有以下幾個原因(UI不能在背景或最重要的更新當SmsReceiver觸發SMS活動甚至可以不存在) 。正確的方法是從接收器發送一個意圖。您可以在接收SMS消息部分看到此link中包含的pdf中詳細的逐步示例。

+0

可能是我錯過了那部分,pdf中的例子似乎不包含如何添加progressdialog。你能告訴我這個嗎? – brompton 2012-08-16 08:54:56

+0

該示例未顯示如何顯示ProgressDialog。可以這樣做: ProgressDialog dialog = new ProgressDialog(context); dialog.setMessage(「message」); dialog.show(); 但是你的問題仍然是一樣的,如果你試圖通過靜態方法從接收者聯繫到活動,你的應用程序將崩潰。看看pdf中的示例,瞭解如何更改發送可能關閉ProgressDialog的意圖的靜態方法 – fegabe 2012-08-16 09:15:34

0

我不認爲發送和接收應該在主線程。您可以使用AsyncTask在後臺接收消息。你可以在開始任務之前顯示對話框, 收到後關閉

0

查找http://developer.android.com/reference/android/os/AsyncTask.html無痛背景線程。

只需在OnPreExecute中顯示您的進度對話框,並在任務到達OnPostExecute時關閉它。

+0

請問:AsyncTask需要使用「擴展」。我怎麼能在「SmsReceiver」中做到這一點,因爲這個類是「擴展BroadcastReceiver」?這對你來說可能很簡單。對不起,我是這個新手。 – brompton 2012-08-16 08:49:09

+0

沒關係,你只需要創建一個擴展AsyncTask的內部類。例如:class LookThroughSMS擴展AsyncTask,如果您需要讀取內部類中的消息,請將其設置爲全局變量或將其傳遞給LookThroughSMS類的構造函數。 – Slickelito 2012-08-16 10:42:05