Я пытаюсь создать приложение таймера android: я хочу иметь возможность добавлять и управлять несколькими таймерами с приложением. Однако у меня есть проблема: каждый раз, когда я нажимаю кнопку «Домой» на телефоне, чтобы перевести приложение в фоновый режим, и блокирую свой телефон, уведомление перестает обновляться, и таймер не воспроизводит звук, когда это сделано (что делает приложение бесполезно).
Я использую службу переднего плана для отображения уведомления и CountDownTimer
для отслеживания прошедшего времени. Служба помечена как android:exported="true"
.
. Чтобы решить мою проблему, я попытался:
- Чтобы приобрести пробуждение в службе:
wakeLock = (getSystemService(Context.POWER_SERVICE) as PowerManager).newWakeLock(
PowerManager.FULL_WAKE_LOCK, "djcuisine:timerServiceWakeLock"
)
wakeLock.acquire()
- Чтобы запрограммировать тревогу с помощью
AlarmManager
во время окончания таймера:
// In the service, once the countdown timer started
val alarmManager = getSystemService(Context.ALARM_SERVICE) as AlarmManager
val intent = Intent(this, AlarmBroadcastReceiver::class.java)
val pendingIntent = PendingIntent.getBroadcast(applicationContext, 234324243, intent, 0)
alarmManager.set(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + timer.remainingMilliseconds, pendingIntent)
Я обновил AndroitManifest
с помощью <receiver android:name=".services.AlarmBroadcastReceiver" android:process=":remote"/>
и создал AlarmBroadcastReceiver
:
package com.djcuisine.services
import android.content.BroadcastReceiver
import android.content.Context
import android.content.Intent
import android.media.AudioAttributes
import android.media.MediaPlayer
import android.media.RingtoneManager
import android.net.Uri
class AlarmBroadcastReceiver: BroadcastReceiver() {
private lateinit var mediaPlayer: MediaPlayer
override fun onReceive(context: Context?, intent: Intent?) {
var alarmUri: Uri? = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_ALARM)
if (alarmUri == null) {
alarmUri = RingtoneManager.getDefaultUri(RingtoneManager.TYPE_NOTIFICATION)
}
val ringtone = RingtoneManager.getRingtone(context, alarmUri)
ringtone.isLooping = true
ringtone.audioAttributes = AudioAttributes.Builder()
.setUsage(AudioAttributes.USAGE_ALARM)
.build()
ringtone.play()
}
}
К сожалению, ничего из этого не имело никакого эффекта. У кого-нибудь есть идеи как это сделать? Пока что у меня нет идей, и мои исследования не дали мне новых.