需要在发送之前延迟短信

时间:2012-02-01 19:06:57

标签: java android

我知道这已被多次询问过,但我在使其工作或找出最有效的方法时遇到了问题。在发送另一条消息之前,我需要让短信在每条消息之间等待2-3秒。我看过并尝试过处理程序,计时器和线程睡眠,我不确定哪种方法最适合我的情况,或者如何使其正常工作。我还是编程的新手,所以请放轻松我。

// ---sends an SMS message---
private void sendSMS(String phoneNumber, String message) {

    int i;
    SmsManager sms = SmsManager.getDefault();
    int amount = 10; // just making 10 the default if the EditText has an
                        // invalid value
    try {
        amount = Integer.parseInt(smsamount.getText().toString());
    } catch (NumberFormatException smsamount) {
    }

    if (amount < 501) {
        for (i = 0; i < amount; i++) {
        sms.sendTextMessage(phoneNumber, null, message, sentPI, null);
        }

2 个答案:

答案 0 :(得分:2)

如果要在每个短信之间使用2秒延迟,请使用ScheduledExecutorService线程池(1个线程可能足以导致您不发送并行)并使用代码调用schedule方法来发送短信。 对于每个呼叫,将延迟参数提高2秒(0,2,4,6,...)

希望它有所帮助。

答案 1 :(得分:0)

也许是这样的。我没有对它进行过测试,但是使用ScheduledExecutorService的想法应该是您所追求的。

public class SMS extends Activity {
    private final static OnClickListener EMPTY_ON_CLICK_LISTENER = new EmptyOnClickListener();
    TextView smsamount;

    // ---sends an SMS message---
    private void sendSMS(String phoneNumber, String message) {
        // just making 10 the default if the EditText has an invalid value
        int amount = 10;

        try {
            amount = Integer.parseInt(smsamount.getText().toString());
        } catch (NumberFormatException smsamount) {
            // Ignore
        }

        sendSMS(phoneNumber, message, amount);
    }

    // ---sends an SMS message---
    private void sendSMS(String phoneNumber, String message, int count) {
        if (count >= 501) {
            new AlertDialog.Builder(SMS.this).setTitle("Maximum amount of messages exceeded!")
                    .setMessage("Please enter 500 or less for the amount of messages")
                    .setNeutralButton("Ok", EMPTY_ON_CLICK_LISTENER).show();
            // Quit early when we know we can't go any further.
            return;
        }

        String SENT = "SMS_SENT";
        PendingIntent sentPI = PendingIntent.getBroadcast(this, 0, new Intent(SENT), 0);
        // ---when the SMS has been sent---
        registerReceiver(new SmsSentBroadcastReceiver(getBaseContext()), new IntentFilter(SENT));

        int delaySeconds = 3;
        ScheduledExecutorService scheduler = new SmsScheduler().sendSmsMessages(phoneNumber, message, sentPI, delaySeconds,
                count);

        // You may cancel the scheduled messages with the scheduler.
        // scheduler.shutdownNow();

        new AlertDialog.Builder(SMS.this).setTitle("Attention!")
                .setMessage("Your messages will start sending shortly, please do not press the send sms button again")
                .setNeutralButton("Ok", EMPTY_ON_CLICK_LISTENER).show();
    }

    private static class SmsSentBroadcastReceiver extends BroadcastReceiver {
        Context context;

        public SmsSentBroadcastReceiver(Context context) {
            this.context = context;
        }

        @Override
        public void onReceive(Context arg0, Intent arg1) {
            switch (getResultCode()) {
            case Activity.RESULT_OK:
                Toast.makeText(context, "SMS sent", Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
                Toast.makeText(context, "Generic failure", Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NO_SERVICE:
                Toast.makeText(context, "No service", Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_NULL_PDU:
                Toast.makeText(context, "Null PDU", Toast.LENGTH_SHORT).show();
                break;
            case SmsManager.RESULT_ERROR_RADIO_OFF:
                Toast.makeText(context, "Radio off", Toast.LENGTH_SHORT).show();
                break;
            }
        }
    }

    private static class EmptyOnClickListener implements OnClickListener {
        public void onClick(DialogInterface dialog, int which) {
            // Does nothing
        }
    }

    private static class SmsScheduler {
        public ScheduledExecutorService sendSmsMessages(final String phoneNumber, final String message,
                final PendingIntent sentIntent, int count, int delaySeconds) {
            final ScheduledExecutorService scheduler = Executors.newScheduledThreadPool(1);

            final SmsManager sms = SmsManager.getDefault();

            // Create the task that will send a SMS message
            final Runnable sender = new Runnable() {
                public void run() {
                    sms.sendTextMessage(phoneNumber, null, message, sentIntent, null);
                }
            };

            // Schedule the messages to be sent at intervals of delaySeconds.
            for (int i = 0; i < count; i++) {
                scheduler.schedule(sender, delaySeconds * i, TimeUnit.SECONDS);
            }

            return scheduler;
        }
    }
}