我正在创建一个Sms垃圾邮件应用程序,该应用程序将向特定号码发送用户定义数量的短信。
for (i = counter; i > 0; i--) {
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show();
}
所以我用了一个for循环。并制作了一个停止按钮,用于终止循环。有人能帮助我们停止这个循环吗?应用程序应该处于初始状态。因为我尝试了"破坏"System.exit(0)"所有内容。但是在计数器结束之前,消息不会停止发送。
您可以定义一个不稳定的布尔变量,如:
volatile boolean doStop = false;
改变你的循环有额外的检查,比如:
for (i = counter; i > 0 && !doStop; i--) {
..
当你按下停止按钮时,你将这个变量设置为true,比如:
doStop = true;
当前代码的第一个问题是,一旦单击按钮,就会导致发送大量消息,甚至在用户意识到他发送了那么多消息之前,您就需要在每条消息之间引入延迟。
下一个问题是,你的应用程序可能会挂起,因为你的应用将执行发送消息的无限循环,在单独的线程中执行代码会有所帮助。
要解决这两个问题,您必须将发送短信的代码放在一个新线程中(为此使用AsyncTask
),并在每条消息发送后以及在延迟检查后(如果单击了停止按钮)引入延迟。
以下是执行此操作的代码:
class SendSMS extends AsyncTask<Void, Void, Void> {
@Override
protected Void doInBackground(Void... params) {
try {
while (!dostop) { //if stop button is clicked stop the loop
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNo, null, message, null, null);
Toast.makeText(getApplicationContext(), +i + " SMS Remaining", Toast.LENGTH_LONG).show(); Thread.sleep(5000);
}
} catch (Exception e) {
}
return null;
}
}
用法:点击发送短信按钮后调用上述代码。
send.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = false; //set to false first
new SendSMS().execute();
}
}
);
单击停止按钮时,您需要设置一个变量dostop=true
。
stop.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
dostop = true;
}
});
此外,我建议添加一些UI来显示发送的短信数量。
我认为您的问题不是退出循环。Le循环终止得太快
祝酒词一一展示。你认为你可以停止循环,但循环已经完成了。尝试在循环中添加日志消息。
像这样使用Android日志:
Log.d("MyTag", "SMS " + i);
接下来,打开logcat,您可以通过"MyTag"进行过滤。
或者你在主线程中进行循环,UI被冻结,所以按钮没有响应。