Android AlarmManager setEexact()不工作

Android AlarmManager setEexact()不工作,android,broadcastreceiver,alarmmanager,Android,Broadcastreceiver,Alarmmanager,我有两个AlarmManager计划在每天23:59发射一次,另一个在同一时间发射,但每周发射一次 以下是执行此操作的两个功能: private fun midnightTimeClearCache(dataType: DataType, requestCode: Int) { val calendar = Calendar.getInstance() calendar.timeInMillis = System.currentTimeMillis()

我有两个AlarmManager计划在每天23:59发射一次,另一个在同一时间发射,但每周发射一次

以下是执行此操作的两个功能:

private fun midnightTimeClearCache(dataType: DataType, requestCode: Int) {
        val calendar = Calendar.getInstance()
        calendar.timeInMillis = System.currentTimeMillis()
        calendar.set(Calendar.HOUR_OF_DAY, 23)
        calendar.set(Calendar.MINUTE, 59)
        val intent = Intent(context, ClearDataReceiver::class.java)
        intent.putExtra(ClearDataReceiver.DATA_TYPE_EXTRA, dataType.name)
        val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)

    }

    private fun weekTimeClearCache(dataType: DataType, requestCode: Int) {
        val calendar = Calendar.getInstance()
        calendar.timeInMillis = System.currentTimeMillis()
        calendar.set(Calendar.HOUR_OF_DAY, 23)
        calendar.set(Calendar.MINUTE, 59)
        var i: Int = calendar.get(Calendar.WEEK_OF_MONTH)
        calendar.set(Calendar.WEEK_OF_MONTH, i++)
        val intent = Intent(context, ClearDataReceiver::class.java)
        intent.putExtra(ClearDataReceiver.DATA_TYPE_EXTRA, dataType.name)
        val pendingIntent = PendingIntent.getBroadcast(context, requestCode, intent, PendingIntent.FLAG_UPDATE_CURRENT)
        alarmManager.setExact(AlarmManager.RTC_WAKEUP, calendar.timeInMillis, pendingIntent)
    }
以下是作为上述未决意图的一部分应被解雇的接收者

class ClearDataReceiver : DaggerBroadcastReceiver() {
 override fun onReceive(context: Context?, intent: Intent?) {
        super.onReceive(context, intent)
        var bundle = intent!!.extras
        val dataTypeString = bundle.getString(DATA_TYPE_EXTRA)
        val dataType = DataType.valueOf(dataTypeString)
        Log.d("JJJ", "clearing data for " + dataTypeString)
        when (dataType) {
            DataType.CUSTOMER_DETAILS -> {
                storage.clearDetails()
                storageClearSchedular.setCustomerDetailsClear()
            }
            DataType.CUSTOMER_PIC -> {
                storage.clearPic()
                storageClearSchedular.setPicClear()
            }
}
这是我的舱单:

和启动接收器,这样我可以重置alerm管理器

override fun onReceive(context: Context?, intent: Intent?) {
        Log.d("JJJ", "onReceive")

        storageClearSchedular = StorageClearSchedular(context!!, context!!.getSystemService(Context.ALARM_SERVICE) as AlarmManager)
        storageClearSchedular.setAllSchedulars()
当我设置上述警报管理器时间表,然后在睡觉前从后台关闭应用程序时,我再次加载该应用程序,发现它没有执行我的广播接收器(没有关于日志和数据的详细信息未清除)

应该发生的是,它应该在我设置的时间执行每个dat,或者每周执行一次,然后在它被触发后再次设置,但它似乎根本不起作用

我第一次尝试setRepeating,但它不能作为api 19及以上版本的im目标设备使用


我缺少什么?

对于19以上的api版本,请使用以下代码

if (Build.VERSION.SDK_INT < 19) {


           alarmManager.set(AlarmManager.RTC,
                calendar.getTimeInMillis(), pendingIntent);
             }
        } else if (Build.VERSION.SDK_INT >= 19 && Build.VERSION.SDK_INT <= 22) {
            alarmManager.setExact(AlarmManager.RTC,
                    calendar.timeInMillis, pendingIntent)
        } else if (Build.VERSION.SDK_INT >= 23) {
            alarmManager.setExactAndAllowWhileIdle(AlarmManager.RTC,
                    calendar.timeInMillis, pendingIntent)
        }
Calendar calendar = Calendar.getInstance()
        // set selected time from timepicker to calendar
        calendar.setTimeInMillis(System.currentTimeMillis());

        // if it's after or equal 9 am schedule for next day
        if (Calendar.getInstance().get(Calendar.HOUR_OF_DAY) >= 9) {
            Log.e("", "Alarm will schedule for next day!");
            calendar.add(Calendar.DAY_OF_YEAR, 1); // add, not set!
        }
        else{
            Log.e("", "Alarm will schedule for today!");
        }
        calendar.set(Calendar.HOUR_OF_DAY, 9);
        calendar.set(Calendar.MINUTE, 0);
        calendar.set(Calendar.SECOND, 0);