繁体   English   中英

为什么 AlarmManager 没有响应?

[英]Why AlarmManager doesn't respond?

在此处输入图片说明 我创建了一个 WorkManager 类,用于使用 AlarmManager 设置通知。 我正在从本地数据库获取有关下一个事件的信息并设置一个 AlarmManager。 当我将我的代码放入 RxJava 的 subscribe 方法时,它工作正常,但是当我决定创建 setAlarm() 方法并放入负责设置警报的代码时,它不起作用。 这是我编写的代码和 Logcat 输出(我用 System.currentTimeInMillis() 替换了 AlarmManager.set())以进行测试,但它不起作用。 这意味着它不会在必要的时间内工作。 那么有什么问题呢?

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()
    }
}

首先简化您的代码。 没有人会理解这里所写的内容。 您必须展示如何创建通知通道以及您的 BroadcastReceiver 和清单的外观。

对于 API 级别 >= 26,您必须创建一个通知渠道。

尝试创建一个空项目只是为了测试 AlarmManager 的工作方式。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM