Search code examples
androidalarmdismiss

Dismiss alarm in android


The first time I worked on broadcast part and run this app, it worked (the alarm went off).

But second time I added cancelAlarm() part and ran it again. It didn't even go off. So I was guessing the previous alarm I had set wasn't removed so the app cant get new input(Alarm) by user.

However I'm not sure. I will really appreciate your feedback. Here's what I have right now.

public class MainActivity extends AppCompatActivity {

    Calendar calendar = Calendar.getInstance();
    TextView dp0;
    AlarmManager alarmManager;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        dp0 = (TextView) findViewById(R.id.tv);
        Button sButton = (Button)findViewById(R.id.btn);
        sButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new TimePickerDialog(MainActivity.this,android.R.style.Theme_Holo_Light_Dialog,onTimeSetListener,
                        calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();
            }
        });
    }

    TimePickerDialog.OnTimeSetListener onTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            Toast.makeText(getApplicationContext(), "Set", Toast.LENGTH_SHORT).show();

            setAlarm(calendar.getTimeInMillis());

            dp0.setText(hourOfDay + ":" + minute);
            final Button sButton1 = (Button) findViewById(R.id.cancelbtn);
            sButton1.setVisibility(View.VISIBLE);
            sButton1.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    dp0.setText("");
                    sButton1.setVisibility(View.INVISIBLE);
                    cancelAlarm();
                }
            });
        }
    };

    public void setAlarm(long timeInMillis) {

        alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this,MyAlarm.class);

        PendingIntent pendingIntent = PendingIntent.getBroadcast(this,0,intent,0);
        alarmManager.set(AlarmManager.RTC_WAKEUP,timeInMillis,pendingIntent);
    }

    public void cancelAlarm() {
        alarmManager = (AlarmManager) getSystemService(ALARM_SERVICE);
        Intent intent = new Intent("Myalarm");
        PendingIntent sender = PendingIntent.getBroadcast(this,0,intent,0);
        alarmManager.cancel(sender);
        sender.cancel();
        Toast.makeText(getApplicationContext(),"Canceled",Toast.LENGTH_SHORT).show();
    }
}

And the BroadcastReceiver:

public class MyAlarm extends BroadcastReceiver {

   MediaPlayer mediaPlayer;

    @Override
    public void onReceive(Context context, Intent intent) {
         mediaPlayer = MediaPlayer.create(context, Settings.System.DEFAULT_RINGTONE_URI);
         mediaPlayer.start();
    }
}

Solution

  • I think you need to use PendingIntent.FLAG_UPDATE_CURRENT. Moreover, I would like to recommend some changes in your code.

    For setting the alarm change your function setAlarm() like this.

    public void setAlarm(long timeInMillis) {
        Intent myIntent = new Intent(getApplicationContext(), MyAlarm.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                        getApplicationContext(), 1, myIntent, 
                                        PendingIntent.FLAG_UPDATE_CURRENT);
    
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
    
        alarmManager.set(AlarmManager.RTC, timeInMillis, pendingIntent);
    }
    

    And for cancelling, the cancelAlarm() should look like.

    public void cancelAlarm() {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent myIntent = new Intent(getApplicationContext(), MyAlarm.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(
                                        getApplicationContext(), 1, myIntent, 
                                        PendingIntent.FLAG_UPDATE_CURRENT);
    
        alarmManager.cancel(pendingIntent);
    }
    

    You might consider taking the onClickListener of sButton1 out of the function onTimeSet. Move the click listener to onCreate function.

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        dp0 = (TextView) findViewById(R.id.tv);
        Button sButton = (Button)findViewById(R.id.btn);
        Button sButton1 = (Button)findViewById(R.id.cancelbtn);
    
        sButton.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new TimePickerDialog(MainActivity.this,android.R.style.Theme_Holo_Light_Dialog,onTimeSetListener,
                        calendar.get(Calendar.HOUR_OF_DAY),calendar.get(Calendar.MINUTE),true).show();
            }
        });
    
        sButton1.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                dp0.setText("");
                sButton1.setVisibility(View.INVISIBLE);
                cancelAlarm();
            }
        });
    }
    
    TimePickerDialog.OnTimeSetListener onTimeSetListener = new TimePickerDialog.OnTimeSetListener() {
        @Override
        public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
            Toast.makeText(getApplicationContext(), "Set", Toast.LENGTH_SHORT).show();
    
            setAlarm(calendar.getTimeInMillis());
    
            dp0.setText(hourOfDay + ":" + minute);
            sButton1.setVisibility(View.VISIBLE);
        }
    };