Hey all of you at Stackoverflow.
I got this incredibly annoying problem. I try to build a SMS application which will send an SMS at a specific time using AlarmManager. And funny enough (cause it seemed the hardest) sending the SMS at a specific time works flawlessly,
but what thrills (or kills) me is that it can only send a SMS after I’ve clicked the Button twice?!
Anybody got an idea cause I’m soon going out of my mind here, been trying for hours.
The code below is the code for the Button.click event:
public void onClick(View arg0)
{
// TODO Auto-generated method stub
//txtClear();
try {
Intent myIntent = new Intent(SMSAlarm.this, MyAlarmService.class);
smsNumber = txtPhoneNo.getText().toString();
smsText = txtMessage.getText().toString();
// if(smsNumber.length()<=0 || smsText.length()<=0)
// {
// Toast.makeText(getBaseContext(),
// "Please enter both phone number and message",
// Toast.LENGTH_SHORT).show();
// }
// else
// {
TimePicker timePickerAlarm = (TimePicker) findViewById(R.id.timePickerAlarm);
DatePicker datePick = (DatePicker) findViewById(R.id.datePickerAlarm);
Calendar calendar = calendarInformation(timePickerAlarm,
datePick);
Calendar today = Calendar.getInstance();
//Check if chosen date is less than the current date and time
//IF True, inform the user that the selected date has passed
//ELSE, start the service for sending SMS
// if(calendar.getTime().getTime() <= today.getTime().getTime())
// {
// Toast.makeText(getBaseContext(), "Date has passed!\nPlease choose a new date", Toast.LENGTH_LONG).show();
// }
// else
// {
Toast.makeText(SMSAlarm.this,
"Start Alarm with \n" +
"smsNumber = " + smsNumber + "\n" +
"smsText = " + smsText,
Toast.LENGTH_LONG).show();
Bundle bundle = new Bundle();
bundle.putCharSequence("extraSmsNumber", smsNumber);
bundle.putCharSequence("extraSmsText", smsText);
myIntent.putExtras(bundle);
requestCode+= 1;
//Temporary solution. Added to make the requestCode unique, to be able to send more than one SMS in a row with different text and to a different number.
pendingIntent = PendingIntent.getService(SMSAlarm.this, requestCode, myIntent, PendingIntent.FLAG_ONE_SHOT); //PendingIntent.FLAG_ONE_SHOT
//pendingIntent = PendingIntent.getService(SMSAlarm.this, 0, myIntent, 0);
//}
//}
txtClear();
}
catch (Exception e)
{
// TODO Auto-generated catch block
Toast.makeText(getBaseContext(), "Error sending SMS " + e.getMessage(), Toast.LENGTH_LONG).show();
e.printStackTrace();
txtClear();
}
}
And here is the MyAlarmService class:
public class MyAlarmService extends Service
{
String smsNumberToSend, smsTextToSend;
@Override
public void onCreate()
{
//TODO Auto-generated method stub
//Toast.makeText(this, "MyAlarmService.onCreate()", Toast.LENGTH_LONG).show();
}
@Override
public IBinder onBind(Intent arg0)
{
// TODO Auto-generated method stub
Toast.makeText(this, "MyAlarmService.onBind()", Toast.LENGTH_LONG).show();
return null;
}
@Override
public void onDestroy()
{
//TODO Auto-generated method stub
super.onDestroy();
Toast.makeText(this, "MyAlarmService.onDestroy()", Toast.LENGTH_LONG).show();
}
@Override
public void onStart(Intent intent, int startId)
{
//TODO Auto-generated method stub
try {
super.onStart(intent, startId);
Bundle bundle = intent.getExtras();
smsNumberToSend = (String) bundle.getCharSequence("extraSmsNumber");
smsTextToSend = (String) bundle.getCharSequence("extraSmsText");
Toast.makeText(this, "Sending Message...", Toast.LENGTH_LONG).show();
Toast.makeText(this,
"Number = " + smsNumberToSend + "\n" +
"Message = " + smsTextToSend,
Toast.LENGTH_LONG).show();
sendSMS(smsNumberToSend, smsTextToSend);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
private void sendSMS(String phoneNumber, String message) {
// TODO Auto-generated method stub
SmsManager smsManager = SmsManager.getDefault();
smsManager.sendTextMessage(phoneNumber, null, message, null, null);
}
@Override
public boolean onUnbind(Intent intent)
{
//TODO Auto-generated method stub
Toast.makeText(this, "MyAlarmService.onUnbind()", Toast.LENGTH_LONG).show();
return super.onUnbind(intent);
}
}
Any help is much appreciated
change PendingIntent.FLAG_ONE_SHOT as myIntent.FLAG_ACTIVITY_NEW_TASK