Таймер останавливается, когда приложение находится в фоновом режиме - PullRequest
0 голосов
/ 01 марта 2020

Я пытаюсь создать приложение таймера 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()
    }

}

К сожалению, ничего из этого не имело никакого эффекта. У кого-нибудь есть идеи как это сделать? Пока что у меня нет идей, и мои исследования не дали мне новых.

...