代码之家  ›  专栏  ›  技术社区  ›  Jono

AlarmManager setEexact()不工作

  •  4
  • Jono  · 技术社区  · 6 年前

    我有两个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 manager

    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目标设备,它不起作用

    我错过了什么?

    1 回复  |  直到 6 年前
        1
  •  1
  •   Paras Watts    6 年前

    对于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)
            }
    

    对于每日警报,您可以检查状况。此示例将设置每天上午9点的警报。此外,您可能需要在设备重新启动或引导时再次设置警报,因为一旦设备断电或重新启动,所有警报都会被取消。

    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);