AlarmManager Запускается сразу, приложение запускается и никогда не спит - PullRequest
0 голосов
/ 15 июня 2019

Я создаю приложение, которое управляет напоминаниями и сигналами тревоги, я использую приложение около 15 дней без проблем, но в настоящее время AlarmManger не запускается в точное время и никогда, пока я не открою приложение вручную. Я не изменил код, относящийся к AlarmManager и BroadcastReceivers, поэтому вот мой код:

  • Синхронизирующий элемент для * AlarmManager с использованием syncTask() в основном:

    object RemindersManager {
    
    private var alarmManager : AlarmManager? = null
    private var alarmIntent : PendingIntent? = null
    
    fun syncTask(context: Context, task: TaskData) {
        if (task.id != null) {
            prepareObjects(context, task)
        }
    }
    
    private fun prepareObjects(context: Context, task: TaskData) {
        if (alarmManager == null) {
            alarmManager = context.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        }
    
        alarmIntent = Intent(IntentActions.REMINDER_RECEIVED).let { intent ->
            intent.setClass(context, AlarmReceiver::class.java)
            intent.addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
            intent.putExtra(DataKeys.TASK_ID, task.id!!)
            PendingIntent.getBroadcast(context, task.id!!.toInt() , intent, PendingIntent.FLAG_ONE_SHOT)
        }
        if (task.reminderDate != null) {
            attachTask(task)
        } else {
            cancelTask()
        }
    
    }
    
    private fun attachTask(task : TaskData) {
        if (!DateUtils.hasDatePassed(task.reminderDate)) {
            when {
                Build.VERSION.SDK_INT >= Build.VERSION_CODES.M -> {
                    alarmManager?.setExactAndAllowWhileIdle(
                        AlarmManager.RTC_WAKEUP,
                        task.reminderDate!!.time,
                        alarmIntent
                    )
                }
                Build.VERSION.SDK_INT >= 21 -> {
                    alarmManager?.setExact(
                        AlarmManager.RTC_WAKEUP,
                        task.reminderDate!!.time,
                        alarmIntent
                    )
                }
            }
        }
    }
    
    private fun cancelTask() {
        alarmManager?.cancel(alarmIntent)
        alarmIntent?.cancel()
    }
    }
    
  • Получение Boardcast :

    class AlarmReceiver : BroadcastReceiver() {
    
    override fun onReceive(context: Context, intent: Intent) {
        if (intent.action == IntentActions.REMINDER_RECEIVED) {
            val taskId = intent.getLongExtra(DataKeys.TASK_ID, -1)
            with(TaskDatabase(context)) {
                getItem(taskId)?.apply {
                    when (reminderType) {
                        TaskData.REMINDER_NOTIFICATION -> {
                            TaskNotification.showNotification(context, this)
                        }
    
                        TaskData.REMINDER_ALARM -> {
                            context.startActivity(
                                Intent(context, AlarmActivity::class.java).apply {
                                    addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
                                    addFlags(Intent.FLAG_RECEIVER_FOREGROUND)
                                    putExtra(DataKeys.TASK_ID, taskId)
                                })
                        }
                    }
                    RepeatingAsyncTask(context).execute(this)
                    close()
                }
            }
        }
    }
    }
    
  • Регистрация Трансляция :

    <receiver
            android:exported="false"
            android:name=".receivers.AlarmReceiver"
            android:enabled="true">
        <intent-filter>
            <action android:name="com.tamimattafi.app.REMINDER_RECEIVED"/>
        </intent-filter>
    </receiver>
    
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...