Вернуть для кнопки исходное состояние через определенное время

Подскажите, какие есть варианты. Необходимо, вернуть кнопку в исходное состояние, но через конкретно заданное время. Если делать через alarm, подскажите как? Нужно сделать так чтобы и после перезагрузки продолжало работать. Таймер, не годится. Вроде простое действие, но подскажите. Спасибо


Ответы (1 шт):

Автор решения: Вася Воронцов

Моё громоздкое решение:

/*Хранилище данных о времени изменения состояния*/
final SharedPreferences sp = getSharedPreferences("YourDirectoryName", Context.MODE_PRIVATE);

/*В первый запуск надо записать в хранилище данные*/
sp.edit().putLong("BlockTime", 0).commit();
/*Только в первый запуск, если время задаётся в активности,
то 0 замените на System.currentTimeMillis() + 10000,
где 10000 - любое целое число миллисекунд*/

/*Выделяем отдельный поток для задачи, чтобы не мешала остальным*/
HandlerThread buttonStateThread = new HandlerThread("your.example.app.ButtonStateThread");
buttonStateThread.start();

/*Создаём обработчик для этого потока*/
final Handler controlHandler = new Handler(buttonStateThread.getLooper());

/*Отдельные Runnable для изменения состояния кнопки из основного потока*/
final Runnable disableButton = new Runnable() {
    @Override
    public void run() {
        button.setEnabled(false);
    };
};
final Runnable ableButton = new Runnable() {
    @Override
    public void run() {
        button.setEnabled(true);
    };
};

/*Обработчик для основного потока*/
final Handler stateHandler = new Handler();

controlHandler.post(new Runnable() {
    @Override
    public void run() {
        /*Получаем текущее время*/
        long now = System.currentTimeMillis();
        /*И сравниваем с записанным*/
        if (sp.getLong("BlockTime", 0) <= now) stateHandler.post(disableButton);
        controlHandler.postDelayed(this, 1);
    };
});

Не думаю, что этот куда нужно посещать куда-либо, кроме активности. Ведь нет смысла в изменении состояния кнопки, если она не нарисована.

Благодаря сохранению времени в SharedPreferences, кнопка будет активирована в нужное время, только если не будет удалены данные, через настройки например.

→ Ссылка