Служба переднего плана с задержкой не работает, если не воспроизводится другое музыкальное приложениеAndroid

Форум для тех, кто программирует под Android
Ответить
Anonymous
 Служба переднего плана с задержкой не работает, если не воспроизводится другое музыкальное приложение

Сообщение Anonymous »

Ниже приведен код для воспроизведения. Служба переднего плана просто издает звуковой сигнал с интервалом в 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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Android»