2012-08-16 25 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