Я создал класс 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()
}
}