#java #android
#java #Android
Вопрос:
У меня есть программа, которая отправляет предопределенные текстовые сообщения группе людей одним нажатием кнопки. У меня это работает хорошо, но проблема в том, что когда он отправляет сообщения, он появляется с 2 тостами на каждое отправленное сообщение. Код:
package com.mfd.alerter;
//imports
public class homeScreen extends Activity {
//buttons
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
//vars
// Grab the time
final Date anotherCurDate = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("km");
final String formattedTime = formatter.format(anotherCurDate);
// Contacts
final String[] numbers = getResources().getStringArray(R.array.numbers);
// Start messages. Only 1 is given to shorten post
callStructureFire.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
String msgText = "MFD PAGE OUT:nStructure FirenTimeout:" formattedTime;
for (int i = 0; i < numbers.length; i ) {
sendSMS(numbers[i], msgText);
}
}
});
//more call types. not important.
}
//---sends a SMS message to another device---
private void sendSMS(String numbers, String message)
{
String SENT = "SMS_SENT";
PendingIntent sentPI = PendingIntent.getBroadcast(this, 0,
new Intent(SENT), 0);
//---when the SMS has been sent---
registerReceiver(new BroadcastReceiver(){
@Override
public void onReceive(Context arg0, Intent arg1) {
switch (getResultCode())
{
case Activity.RESULT_OK:
Toast.makeText(getBaseContext(), "SMS sent",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_GENERIC_FAILURE:
Toast.makeText(getBaseContext(), "Generic failure",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NO_SERVICE:
Toast.makeText(getBaseContext(), "No service",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_NULL_PDU:
Toast.makeText(getBaseContext(), "Null PDU",
Toast.LENGTH_SHORT).show();
break;
case SmsManager.RESULT_ERROR_RADIO_OFF:
Toast.makeText(getBaseContext(), "Radio off",
Toast.LENGTH_SHORT).show();
break;
}
}
}, new IntentFilter(SENT));
SmsManager sms = SmsManager.getDefault();
sms.sendTextMessage(numbers, null, message, sentPI, null);
}
//action bar stuff. not important.
}
Более подробно: допустим, я отправляю текст 3 людям, появится 6 всплывающих сообщений с надписью «Отправлено SMS». Как мне сделать так, чтобы отображалось только 3?
Кроме того, есть ли способ, возможно, добавить счетчик отправленных сообщений? Например: «Отправлено сообщение 1/10», «Отправлено сообщение 2/10» и т. Д.?
Ответ №1:
Я действительно не смотрел на ваш код и не спрашивал себя, почему это происходит, но вот трюк, чтобы тосты не появлялись дважды:
Создайте экземпляр Toast с помощью makeToast(), прежде чем показывать его, вы вызываете cancel() , устанавливаете текст, а затем вызываете show() . Это приведет к отклонению предыдущего тоста. Вы даже не заметите, что тост отображается дважды.
Это глупый обходной путь, но он работает для меня 😉
Ответ №2:
Разве вы не должны регистрировать получателя только один раз, а не каждый раз, когда вы вызываете sendSMS. Вы получаете 6 тостов с тремя sms-сообщениями, потому что у вас есть 3 широковещательных получателя. Итак, при первом запуске вы получаете 1 тост. Во втором запуске вы получаете 2 тоста (вызывается приемник, который был зарегистрирован в первом запуске, и тот, который был зарегистрирован во втором). При третьем запуске вызываются все три получателя, поэтому вы получаете еще три тоста. Всего в сумме — 6 тостов…
итак, я думаю, вам нужно зарегистрировать только одного получателя перед циклом for, в котором вы вызываете sendSMS, или, если вы хотите зарегистрировать в sendSMS, тогда вам нужно отменить регистрацию в конце метода.
Я надеюсь, что это поможет, приветствия!
Комментарии:
1. (Я новичок в программировании на Java / Android, так что будьте терпеливы со мной в терминах.) Можете ли вы показать мне, о какой части вы говорите, и возможное исправление? Я не уверен, о чем вы говорите.
2. (После выполнения нескольких быстрых тестов) Я верю, что вы правы в своем ответе, хотя каждый раз, когда я добавляю контакт, он увеличивается в геометрической прогрессии.
3. Пока это не решено полностью. Все еще пытаюсь выяснить, как остановить цикл приемника.
4. ооо .. просто извлеките метод registerReceiver и всю реализацию BroadcastReceiver из метода sendSMS и поместите его перед callStructureFire.setOnClickListener(новый вид. OnClickListener() …. Это должно выполнить свою работу…
5. Спасибо. Это сработало. Будет намного лучше знать, что мой телефон не будет бодрствовать в течение 10 минут, чтобы я случайно не нажал еще одну кнопку, lol.