-6

ユーザーが定義した数の SMS を特定の番号に送信する 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 ループを使用しました。そして、この for ループを終了する停止ボタンを作成しました。この for ループを停止する方法を誰でも手伝ってもらえますか?アプリは初期状態になります。「System.exit(0)」をすべて「中断」しようとしたためです。しかし、メッセージはカウンターが終了するまで送信を停止しません。

4

3 に答える 3

2

次のような揮発性ブール変数を定義できます。

volatile boolean doStop = false;

ループを変更して、次のような追加のチェックを行います。

 for (i = counter; i > 0 && !doStop; i--) {
    ..

停止ボタンを押すと、次のようにこの変数を true に設定します。

doStop = true;
于 2015-03-07T12:44:30.107 に答える
1

現在のコードで発生する最初の問題は、ボタンをクリックすると、ユーザーが多くのメッセージを送信したことに気付く前に大量のメッセージが送信されることになり、各メッセージ間に遅延を誘発する必要があることです。

次の問題は、アプリがメッセージ送信の無限ループを実行するため、アプリがハングする可能性があることです。別のスレッドでコードを実行すると役立ちます。

これら 2 つの問題を解決するには、送信 SMS コードを新しいスレッドに配置し (そのために使用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;
        }
    }

使用法: SMS の送信ボタンがクリックされた後、上記のコードを呼び出します。

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;
            }
        });

また、送信された SMS の数を表示する UI を追加することをお勧めします。

于 2015-03-07T17:59:58.243 に答える
0

あなたの問題はループを出ていないと思います。ル ループはすぐに終了します。
トーストは1つずつ表示されます。そして、あなたはループを止めることができると思いますが、ループはすでに行われています. ループにログ メッセージを追加してみてください。

そのような Android ログを使用します。

Log.d("MyTag", "SMS " + i);

次にlogcatを開くと、「MyTag」でフィルタリングできます。


または、メイン スレッドでループを作成し、UI がフリーズしたため、ボタンが応答しません。

于 2015-03-07T17:18:18.423 に答える