【问题标题】:make progressdialog while waiting to receive SMS在等待接收短信时进行进度对话框
【发布时间】:2012-08-16 07:37:28
【问题描述】:

我是 Android 和 Java 新手。下面的代码是发送和等待接收短信。由于该过程可能需要大约 3 分钟,我需要一个 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");}           
    }
}
}

【问题讨论】:

  • 嘿,您创建接收器来获取短信,那么为什么需要进度对话框?请阅读此内容---> developer.android.com/reference/android/content/…
  • 应用正在发送短信并等待该号码回复短信。这个过程需要一段时间。所以我需要一个进度对话框。抱歉,我不太明白您发送的链接。

标签: java android sms progressdialog


【解决方案1】:

我认为您可以尝试重新考虑您的方法。您不能指望用户会等待最多 3 分钟的 SMS。所以你的代码看起来是正确的(除了我稍后解释的静态方法的一部分),但是一旦你的消息被发送,我会显示一条消息,你的应用正在等待消息,并且当消息在SmsReceiver,您可以与Sms 活动进行通信。

但是,您不应该使用该静态方法来更新活动的内容,原因有几个(UI 无法在后台更新,或者最重要的是当SmsReceiver 被触发时@ 987654325@ 活动甚至可以不存在)。正确的方法是从接收者发送一个意图。您可以在接收 SMS 消息部分的link 中包含的 pdf 中查看详细的分步示例。

【讨论】:

  • 可能是我错过了那部分,pdf中的示例似乎不包含如何添加进度对话框。你能给我看看这个吗?
  • 该示例未显示如何显示 ProgressDialog。可以这样完成: ProgressDialog dialog = new ProgressDialog(context); dialog.setMessage("消息");对话框.show();但是您的问题仍然存在,如果您尝试通过静态方法从接收器联系到活动,您的应用程序将崩溃。查看 pdf 中的示例,了解如何更改静态方法以发送可能关闭 ProgressDialog 的意图
【解决方案2】:

我认为发送和接收不应该在主线程中。您可以使用 AsyncTask 在后台接收消息。您可以在开始任务之前显示对话框,并且 收到后关闭

【讨论】:

    【解决方案3】:

    查找http://developer.android.com/reference/android/os/AsyncTask.html 以获取无痛后台线程。

    只需在 OnPreExecute 中显示您的进度对话框,并在任务到达 OnPostExecute 时将其关闭。

    【讨论】:

    • 请问:AsyncTask 需要使用“extends”。由于类是“扩展广播接收器”,我怎么能在“SmsReceiver”中做到这一点?这对你来说可能很容易。抱歉,我是新手。
    • 没关系,你只要做一个扩展AsyncTask的内部类。例如:类 LookThroughSMS 扩展 AsyncTask,如果你需要在你的内部类中读取消息,将其设为全局变量或将其传递给 LookThroughSMS 类的构造函数。
    猜你喜欢
    • 1970-01-01
    • 2016-09-21
    • 1970-01-01
    • 2013-07-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-14
    • 1970-01-01
    相关资源
    最近更新 更多