Ниже приведен код для воспроизведения. Служба переднего плана просто издает звуковой сигнал с интервалом в 20 секунд (конечно, моя настоящая служба выполняет полезную работу для пользователя) в фоновом режиме.
Если я запущу службу, выйду в главный экран (чтобы мое приложение не отображалось), а затем выключите экран, интервал звукового сигнала даже близко не равен 20 секундам. Это случайно, но примерно от 40 до 60 секунд.
Самое смешное: если я воспроизвожу какой-либо продолжительный звук с помощью музыкального проигрывателя или приложения для подкастов, мое приложение сможет воспроизвести звуковой сигнал с интервалом 20 секунд. Я установил для своего приложения «Разрешить фоновое использование», поэтому не знаю, почему это происходит. Такое случается с Android 14 и 15.
Что не так? Это не невозможно из-за экономии заряда батареи, не так ли? Экономия заряда батареи бессмысленна, если пользователь не может выполнить важную фоновую задачу, которую хочет.
class MyTestService : Service()
{
val serviceJob = SupervisorJob()
val serviceScope = CoroutineScope(Dispatchers.IO + serviceJob)
var needsToQuit = false;
companion object
{
const val CHANNEL_ID = "MyForegroundServiceChannel"
const val NOTIFICATION_ID = 123456
}
override fun onStartCommand(intent: Intent?, flags: Int, startId: Int): Int
{
needsToQuit = false;
createNotificationChannel()
val notification = buildNotification("Don't kill me…")
startForeground(NOTIFICATION_ID, notification)
doSomethingPeriodically();
return START_STICKY
}
private fun doSomethingPeriodically()
{
serviceScope.launch {
while (isActive)
{
var toneGen = ToneGenerator(AudioManager.STREAM_MUSIC, 100);
toneGen.startTone(ToneGenerator.TONE_CDMA_ALERT_CALL_GUARD, 200);
delay(20_000)
}
}
}
private fun buildNotification(contentText: String): Notification
{
return NotificationCompat.Builder(this, CHANNEL_ID)
.setContentTitle("Don't kill me")
.setContentText(contentText)
.setSmallIcon(R.drawable.ic_launcher_foreground)
.build()
}
private fun createNotificationChannel()
{
val channel = NotificationChannel(
CHANNEL_ID,
"Don't kill me",
NotificationManager.IMPORTANCE_LOW
)
val manager = getSystemService(NotificationManager::class.java)
manager?.createNotificationChannel(channel)
}
override fun onBind(intent: Intent?): IBinder?
{
return null;
}
override fun onDestroy()
{
super.onDestroy()
serviceJob.cancel()
}
}
Подробнее здесь: https://stackoverflow.com/questions/793 ... is-playing