Почему AlarmManager не отвечает? - PullRequest
0 голосов
/ 26 февраля 2020

enter image description here Я создал класс WorkManager для настройки уведомлений с помощью AlarmManager. Я получаю информацию о следующем событии из локальной базы данных и устанавливаю AlarmManager. Когда я помещаю свой код в метод подписки Rx Java, он работает нормально, но когда я решил создать метод setAlarm (), помещаю код, отвечающий за установку Alarm, он не работает. Вот код, который я написал, и вывод Logcat (я заменил AlarmManager.set () на System.currentTimeInMillis ()) для тестирования, но он «не работает». Что означает, что это не сработает в нужное время. Так что может быть не так?

import android.app.AlarmManager
import android.app.PendingIntent
import android.content.Context
import android.content.Intent
import android.content.SharedPreferences
import android.util.Log
import androidx.work.Worker
import androidx.work.WorkerParameters
import io.reactivex.android.schedulers.AndroidSchedulers
import io.reactivex.disposables.CompositeDisposable
import io.reactivex.schedulers.Schedulers
import org.fursa.spacex.AppDelegate
import org.fursa.spacex.utils.const.ApiConst.MISSION_DETAIL
import org.fursa.spacex.utils.const.ApiConst.MISSION_NAME
import org.fursa.spacex.api.ApiRequest
import org.fursa.spacex.db.Launch
import org.fursa.spacex.utils.formatDate
import org.fursa.spacex.utils.toLaunch
import java.util.*
import javax.inject.Inject

class AlarmSetterWorker(context: Context, workerParams: WorkerParameters) : Worker(context, workerParams) {

    init {
        AppDelegate.injector.inject(this)
    }

    @Inject
    lateinit var alarmManager: AlarmManager

    @Inject
    lateinit var apiRequest: ApiRequest

    @Inject
    lateinit var preferences: SharedPreferences

    private val disposable = CompositeDisposable()

    override fun doWork(): Result {
        disposable.add(apiRequest.getNextKnownLaunch()
            .subscribeOn(Schedulers.io())
            .observeOn(AndroidSchedulers.mainThread())
            .map { launchResponse -> toLaunch(launchResponse) }
            .subscribe({
                launch -> setAlarm(launch)
            }, {
                Log.d("Spacex/Alarm", it.localizedMessage)
            }))
        return Result.success()
    }

    private fun setAlarm(launch: Launch) {

        val rightBeforeKey = preferences.getBoolean("just_before_key", false)
        val dayBeforeKey = preferences.getBoolean("just_before_key", false)
        val minutesBeforeKey = preferences.getInt("notification_padding", 0)

        Log.d("Spacex/Alarm", "Right before key: $rightBeforeKey")
        Log.d("Spacex/Alarm", "Day before key: $dayBeforeKey")
        Log.d("Spacex/Alarm", "Minutes before key: $minutesBeforeKey")


        val calendar = Calendar.getInstance()
        calendar.apply { timeInMillis = launch.timestamp * 1000 }

        if(rightBeforeKey) {
            val alarmIntent = Intent(applicationContext, AlarmReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(applicationContext, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)

            alarmIntent.putExtra(MISSION_NAME, launch.title)
            alarmIntent.putExtra(MISSION_DETAIL, "Is launching right now!")

            Log.d("Spacex/Alarm", "Right before set at: ${formatDate(calendar.timeInMillis)}")
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
        }

        if(dayBeforeKey) {
            val alarmIntent = Intent(applicationContext, AlarmReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(applicationContext, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)

            alarmIntent.putExtra(MISSION_NAME, launch.title)
            alarmIntent.putExtra(MISSION_DETAIL, "Is launching tomorrow!")

            calendar.add(Calendar.DAY_OF_MONTH, -1)
            Log.d("Spacex/Alarm", "Day before set at: ${formatDate(calendar.timeInMillis)}")
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
        }

        if(minutesBeforeKey > 0) {
            val alarmIntent = Intent(applicationContext, AlarmReceiver::class.java)
            val pendingIntent = PendingIntent.getBroadcast(applicationContext, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT)

            alarmIntent.putExtra(MISSION_NAME, launch.title)
            alarmIntent.putExtra(MISSION_DETAIL, "Is launching in $minutesBeforeKey minutes!")

            calendar.apply { timeInMillis = launch.timestamp * 1000 }
            calendar.add(Calendar.MINUTE, -minutesBeforeKey)
            Log.d("Spacex/Alarm", "Minutes before set at: ${formatDate(calendar.timeInMillis)}")
            alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
        }

    }

    override fun onStopped() {
        super.onStopped()
        disposable.clear()
    }
}

1 Ответ

0 голосов
/ 27 февраля 2020

Упростите ваш код для начала. Никто не поймет, что здесь написано. Вы должны показать, как вы создаете канал уведомлений, как выглядит ваш BroadcastReceiver и ваш манифест.

Для уровня API> = 26 необходимо создать канал уведомлений.

Попробуйте создать пустой проект, просто чтобы проверить, как работает AlarmManager.

...