Как запускать действие каждый раз когда SwitchCompat Button включена?

119
16 июня 2021, 23:20

Есть кнопка-переключатель SwitchCompat, когда она включена должно прийти локальное уведомление. Проблема в том, что если установить время, потом включить тумблер то уведомление придет, но если оставить тумблер включенным и задать новое время на уведомление, то оно не придет пока не выключить и снова включить тумблер. Как это исправить? Я так понимаю программа только один раз проверяет включен ли тумблер или нет?

Участок кода Activity:

public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {
    private EditText mondayText;
    private SwitchCompat mondaySwitch;
    SharedPreferences sPref;
    String timeText = "";
    final String SAVED_TEXT = "saved_text";
    boolean switch_On_Off;
    public static final String PREFS_NAME = "Switch_On_Off_check";
    final Calendar c = Calendar.getInstance();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
        mondayText = findViewById(R.id.monday_time);
        mondaySwitch = findViewById(R.id.switch_monday);
        // load SharedPref save text in mondayText and save switch On else Off
        loadText();
        loadSwitchCheck();
        mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                startAlarm(c);
                saveSwitchCheck();
            }
        });

        mondayText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
            }
        });

    }
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        updateTimeText(c);
    }
    private void updateTimeText(Calendar c) {
        // clean EditText time
        timeText = "";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        mondayText.setText(timeText);
        saveText();
    }
    public void startAlarm(Calendar c) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
        if (c.before(Calendar.getInstance())) {
            c.add(Calendar.DATE, 1);
        }
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
    }

Значит, сделал проверку на включение/выключение переключателя (или я так думаю, что сделал) но теперь уведомление приходит всегда, полностью игнорируется переменная boolean OnOff

Исправленный код:

public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {
    private EditText mondayText;
    public SwitchCompat mondaySwitch;
    SharedPreferences sPref;
    String timeText = "";
    final String SAVED_TEXT = "saved_text";
    boolean switch_On_Off;
    boolean OnOff;
    public static final String PREFS_NAME = "Switch_On_Off_check";
    final Calendar c = Calendar.getInstance();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
        mondayText = findViewById(R.id.monday_time);
        mondaySwitch = findViewById(R.id.switch_monday);
        // load SharedPref save text in mondayText and save switch On else Off
        loadText();
        loadSwitchCheck();
        mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (mondaySwitch.isChecked()) {
                    OnOff = true;
                    Toast.makeText(getApplicationContext(), "Включено", Toast.LENGTH_SHORT).show();
                } else {
                    OnOff = false;
                    Toast.makeText(getApplicationContext(), "Выключено", Toast.LENGTH_SHORT).show();
                }
                saveSwitchCheck();
            }
        });
        mondayText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
            }
        });
    }
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
        updateTimeText(c);
        if (OnOff = true) {
            startAlarm(c);
        } else {
            Toast.makeText(getApplicationContext(), "Включите", Toast.LENGTH_SHORT).show();
        }
    }
    private void updateTimeText(Calendar c) {
        timeText = "";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        mondayText.setText(timeText);
        saveText();
    }
    public void startAlarm(Calendar c) {

        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
        if (c.before(Calendar.getInstance())) {
            c.add(Calendar.DATE, 1);
        }
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
    }
Answer 1

На данный момент нашел только одно решение, выключать через код switch переключатель каждый раз, когда пользователь устанавливает новое время, так как данное напоминание будет работать раз в неделю в указанное время, пользователь не будет часто менять время уведомления, если будет нужда, всегда можно написать строчку, чтобы при установки нового времени переключатель сначала выключался, а потом снова включался. Если кому понадобится, код прилагаю:

public class AlarmActivity extends AppCompatActivity implements TimePickerDialog.OnTimeSetListener {

    private EditText mondayText;
    public SwitchCompat mondaySwitch;
    SharedPreferences sPref;
    String timeText = "";
    final String SAVED_TEXT = "saved_text";
    boolean switch_On_Off;
    public static final String PREFS_NAME = "Switch_On_Off_check";
    final Calendar c = Calendar.getInstance();
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_alarm);
        mondayText = findViewById(R.id.monday_time);
        mondaySwitch = findViewById(R.id.switch_monday);
        // load SharedPref save text in mondayText and save switch On else Off
        loadText();
        loadSwitchCheck();
        mondaySwitch.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() {
            @Override
            public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) {
                if (mondaySwitch.isChecked()) {
                    // запуск уведомления если активирован переключатель
                    startAlarm(c);
                }
                saveSwitchCheck();
            }
        });
        mondayText.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DialogFragment timePicker = new TimePickerFragment();
                timePicker.show(getSupportFragmentManager(), "time picker");
            }
        });
    }
    @Override
    public void onTimeSet(TimePicker view, int hourOfDay, int minute) {
         // деактивируем переключатель
         mondaySwitch.setChecked(false);
        c.set(Calendar.HOUR_OF_DAY, hourOfDay);
        c.set(Calendar.MINUTE, minute);
        c.set(Calendar.SECOND, 0);
       // после установки времени активируем переключатель без участия пользователя (при желании) 
         mondaySwitch.setChecked(true);
        updateTimeText(c);

        saveText();
    }
    private void updateTimeText(Calendar c) {
        // clear old time text
        timeText = "";
        timeText += DateFormat.getTimeInstance(DateFormat.SHORT).format(c.getTime());
        mondayText.setText(timeText);
    }
    public void startAlarm(Calendar c) {
        AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
        Intent intent = new Intent(this, AlertReceiver.class);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(this, 1, intent, 0);
        if (c.before(Calendar.getInstance())) {
            c.add(Calendar.DATE, 1);
        }
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, c.getTimeInMillis(), pendingIntent);
    }
READ ALSO
Обьединение запроса в Spring Data-Jpa

Обьединение запроса в Spring Data-Jpa

Использую в проекте Spring Data-Jpa и появилась необходимость использовать метод saveAll() (у меня CRUD интерфейс который я наследую от JpaRepository)Сейчас,...

107
Как сохранить данные из приложения, которое работает в режиме отладки?

Как сохранить данные из приложения, которое работает в режиме отладки?

Написал приложение под Андроид для собственных нуждБез публикации, просто запустил на мобильном телефоне из под Android Studio

106
Что означает действие в скобках?

Что означает действие в скобках?

Что означает действие в скобках конкретно в моей ситуации?

120
Как разбудить устройство в BroadcastReceiver?

Как разбудить устройство в BroadcastReceiver?

Условие: Есть приложение которое, в определённый момент, должно пробуждать устройство (экран устройства должен включится) и показывать уведомлениеРабота...

101