Виконати код о 11:59 PM кожного дня, але не під час запуску.
1 2 3 4 5 6 7 8 9 10 11 |
val resetStepsTimer = Timer() val resetTask: TimerTask = object : TimerTask() { override fun run() { previousTotalSteps = totalSteps binding.textViewSteps.text = 0.toString() saveData() Log.d(TAG, "Steps Reset") } } // repeat every 24 hrs resetStepsTimer.schedule(resetTask, 0L, 1000*60*60*24) |
Маю код, який зберігає кількість кроків у базі даних кожну годину:
1 2 3 4 5 6 7 8 9 10 11 12 |
val saveStepsTimer = Timer() val saveTask: TimerTask = object : TimerTask() { override fun run() { val stepCount = binding.textViewSteps.text.toString().toInt() val dateCurrent = binding.textViewDate.text.toString() val steps = Steps(0, stepCount, dateCurrent) db.dateCheck(steps, dateCurrent, db.writableDatabase) Log.d(TAG, "Step Count Saved to DB") } } // repeat every hour saveStepsTimer.schedule(saveTask, 0L, 1000 * 60 * 60) |
Тепер я хочу реалізувати схожу функціональність для скидання кроків щодня. Раніше я мав кнопку для цього для тестування, але пізніше спробував System.currentTimeMillis(), який повертав час при запуску, і не динамічно оновлювався. Тому я хочу використовувати Timer() для запуску цього коду кожні 24 години. Проте, він також запускається при кожному запуску програми, що не є доречно.
Код для скидання кроків виглядає наступним чином:
1 2 3 4 5 6 7 8 9 10 11 |
val resetStepsTimer = Timer() val resetTask: TimerTask = object : TimerTask() { override fun run() { previousTotalSteps = totalSteps binding.textViewSteps.text = 0.toString() saveData() Log.d(TAG, "Steps Reset") } } // repeat every 24 hrs resetStepsTimer.schedule(resetTask, 0L, 1000*60*60*24) |
Функціональність працює ідеально, просто я не хочу, щоб вона працювала випадково під час відкриття додатка. Я хочу, щоб це відбувалося о 11:59 PM кожного дня.
Я спробував витягнути це з функції onCreate, але тоді resetStepsTimer.schedule(resetTask, 0L, 1000*60*60*24) викликає помилку з оголошенням елемента, і не працюватиме без доступу до деяких змінних (таких як textViewSteps).
Також я спробував:
1 2 3 4 5 6 7 8 |
val intent = Intent(this, MainActivity::class.java) val resetIntent = PendingIntent.getActivity(this, 0, intent, PendingIntent.FLAG_IMMUTABLE) // Встановити сповіщення на сьогодні о 23:59 val calendar = Calendar.getInstance(TimeZone.getTimeZone("GMT")) calendar.set(Calendar.HOUR_OF_DAY, 23) calendar.set(Calendar.MINUTE, 59) val alarmManager = getSystemService(ALARM_SERVICE) as AlarmManager alarmManager[AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis()] = resetIntent |
Але з цим, мабуть, потрібно використовувати іншу активність у намірі, а я намагаюся зберегти цю функціональність всередині тієї ж самої активності, якщо є спосіб використати AlarmManager у цьому MainActivity?