0

I have a repeated alarm registered and it works. But when I try to cancel it, it wouldn't cancel. I have tried solutions in these postes:post1post2 Activity's oncreate():

private void init() {
        btToggleLocationService = (Button) findViewById(R.id.btToggleLocationService);
        btToggleLocationService.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                if(LocatorAlarmManager.isRegistered(MainActivity.this)){
                    Log.d(TAG, "onClick() Alarm  registered, stopping...");
                    LocatorAlarmManager.stopAlarm(MainActivity.this);
                    updateServiceButton();
                }else{
                    Log.d(TAG, "onClick() Alarm not registered, registreing...");
                    LocatorAlarmManager.registerAlarm(MainActivity.this);
                    updateServiceButton();
                }

            }
        });
        updateServiceButton();
    }

And my LocationAlarmManager class:

public class LocatorAlarmManager {
    private static final String TAG = LocatorAlarmManager.class.getSimpleName();
    public static final int REQUEST_CODE = 99321;

    /**
     * Registers the Location alarm. Will ignore call if its already registerd.
     */
    public static void registerAlarm(Context context) {
        if (isRegistered(context)) {
            Log.i(TAG, "already Registred alarmt");
            return;
        }
        long firstTime = SystemClock.elapsedRealtime();
        firstTime += 3 * 1000;

        SharedPreferences sPrefs = PreferenceManager
                .getDefaultSharedPreferences(context);
        AlarmManager am = (AlarmManager) context
                .getSystemService(Activity.ALARM_SERVICE);
        am.setRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, firstTime,
                LocaterSettings.getSendLocationInterval(sPrefs) * 1000L,
                getSendLocationIntent(context, 0));
        Log.i(TAG, "registerAlarm() Registred alarmt");

    }

    /**
     * Checks if the Location alarm has been registered or not.
     * 
     * @return true if its registed, false if not.
     */
    public static boolean isRegistered(Context context) {
        boolean alarmUp = getSendLocationIntent(context,
                PendingIntent.FLAG_NO_CREATE) != null;

        if (alarmUp) {
            Log.d(TAG, "isRegistered() Alarm is already active");
            return true;
        } else {
            Log.d(TAG, "isRegistered() Alarm is NOT active");
            return false;
        }
    }

    public static void stopAlarm(Context context) {
        Log.d(TAG, "stopAlarm() Stopping alarm");
        AlarmManager alarmManagerstop = (AlarmManager) context
                .getSystemService(Activity.ALARM_SERVICE);
        try {
            alarmManagerstop.cancel(getSendLocationIntent(context, 0));
        } catch (Exception e) {
            e.printStackTrace();
        }
        Log.d(TAG, "stopAlarm() Stopped alarm");
    }

    private static PendingIntent getSendLocationIntent(Context context, int flag) {
        return PendingIntent.getBroadcast(context, REQUEST_CODE, new Intent(
                context, LocationReciever.class), flag);

    }

Log:

Button Click start alarm
05-23 21:35:29.780: D/LocatorAlarmManager(16329): isRegistered() Alarm is NOT active
05-23 21:35:29.780: D/MainActivity(16329): onClick() Alarm not registered, registreing...
05-23 21:35:29.780: D/LocatorAlarmManager(16329): isRegistered() Alarm is NOT active
05-23 21:35:29.790: I/LocatorAlarmManager(16329): registerAlarm() Registred alarmt
05-23 21:35:29.790: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active

Button Click stop alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active
05-23 21:35:59.203: D/MainActivity(16329): onClick() Alarm  registered, stopping...
05-23 21:35:59.203: D/LocatorAlarmManager(16329): stopAlarm() Stopping alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): stopAlarm() Stopped alarm
05-23 21:35:59.203: D/LocatorAlarmManager(16329): isRegistered() Alarm is already active

Problem is the last line in log, It should be canceled, but after it is, its checked again and it says its 'already registered',I would like to know, what is wrong with my stop alarm action. Thanks in advance.

Community
  • 1
  • 1
wtsang02
  • 17,325
  • 9
  • 46
  • 65

2 Answers2

1

You will have to cancel the PendingIntent as well after you cancel the alarm.

try {
    alarmManagerstop.cancel(getSendLocationIntent(context, 0));
    getSendLocationIntent(context, 0).cancel();
} catch (Exception e) {
    e.printStackTrace();
}

This will fix your problem.

neo108
  • 4,996
  • 3
  • 25
  • 40
-1

When you create the PendingIntents, use PendingIntent.FLAG_UPDATE_CURRENT as the last argument.

return PendingIntent.getBroadcast(context, REQUEST_CODE, new Intent(context, 
    LocationReciever.class), PendingIntent.FLAG_UPDATE_CURRENT);
Karakuri
  • 36,506
  • 12
  • 75
  • 103