Kotlin Broadcast Receiver работает только в первый раз после перезапуска приложения - PullRequest
0 голосов
/ 01 марта 2020

У меня проблема с приемником вещания моего приложения, что сводит меня с ума.

Я реализую приложение с целью быть простым утренним будильником, с некоторыми логиками c, которые стоят за этим обновлением времени срабатывания будильника. Приемник вещания должным образом перехватывает сигнал тревоги, отправленный диспетчером сигналов тревоги в нужное время Когда приемник вещания получает сигнал тревоги, начинается специальное действие по прерыванию вибрации и звука. Как только пользователь нажимает кнопку, вибрация и звук прекращаются, и активность завершается sh. Кажется, все работает нормально, за исключением того, что, как только я остановил первый сигнал тревоги, который я установил с момента последнего запуска приложения, и система вернулась к основному действию, если я установил новый сигнал тревоги, это не сработает. Единственный способ запустить новое срабатывание будильника - это запустить приложение из меню приложения. И если я установлю 2 или более будильника перед первым срабатыванием, все эти будильники сработают правильно.

Последовательность в пуле следующая:

  • Запустите приложение;
  • Настройка нового будильника;
  • Ожидание срабатывания будильника;
  • Отключение будильника от выделенной активности; -> OK
  • Установить новый сигнал тревоги;
  • Дождитесь сигнала тревоги до пожара; -> никогда не сработает ;
  • Закройте приложение;
  • Перезапустите приложение;
  • Установите новый будильник;
  • Дождитесь сигнала тревоги до пожара;
  • Отключение будильника от выделенного занятия; -> ОК

В манифесте я установил разрешение на вибрацию и блокировку следа

<uses-permission android:name="android.permission.VIBRATE" />
<uses-permission android:name="android.permission.WAKE_LOCK" />

определили основное действие и действие деактивации следующим образом:

<activity
    android:name=".MainActivity"
    android:showOnLockScreen="true"
    android:turnScreenOn="true">
    <intent-filter>
        <action android:name="android.intent.action.MAIN" />
        <category android:name="android.intent.category.LAUNCHER" />
    </intent-filter>
</activity>

<activity
    android:name=".AlarmDeactivation"
    android:configChanges="orientation|keyboardHidden|screenSize"
    android:label="@string/title_activity_alarm_deactivation"     
    android:theme="@style/AppTheme.NoActionBar"
    android:showOnLockScreen="true"
    android:turnScreenOn="true">
</activity>

Получатель затем регистрируется в манифесте следующим образом:

<receiver android:name=".AlarmReceiver"
    android:enabled="true"
    android:exported="true"
    android:process=":remote"
    android:stopWithTask="false">
</receiver>

В основном действии я пытался выполнить оба действия: регистрировать, а не широковещательный получатель, поскольку он зарегистрирован в манифесте, но результаты не меняются (и я пытался в функциях onStart, onResume и onResults.

private fun registerBroadcastReceiver(){
    val filter = IntentFilter()
    registerReceiver(AlarmReceiver(),filter)
}

В основной деятельности это как Я запускаю тревогу с помощью диспетчера тревог:

private fun startAlarm(clockTime:String, alarmId:Int) {

    try {
        var pendingIntent: PendingIntent? = null

        alarmManager = this.getSystemService(Context.ALARM_SERVICE) as AlarmManager
        val calendar = Calendar.getInstance()
        calendar.set(Calendar.HOUR_OF_DAY, clockTime.split(":")[0].toInt())
        calendar.set(Calendar.MINUTE, clockTime.split(":")[1].toInt())
        intent = Intent(this, AlarmReceiver::class.java)
        intent.putExtra("alarmId", alarmId)
        pendingIntent =
                PendingIntent.getBroadcast(this, alarmId, intent, PendingIntent.FLAG_UPDATE_CURRENT)

        var time = calendar.timeInMillis - calendar.timeInMillis % 60000

        if (System.currentTimeMillis() > time) {
            if (Calendar.AM_PM === 0)
                time += 1000 * 60 * 60 * 12
            else
                time += time + 1000 * 60 * 60 * 24
        }
        alarmManager!!.set(AlarmManager.RTC, time, pendingIntent)
    }
    catch(e: Exception){
        print("Something went wrong in starting the alarm")
    }
}

Приемник BroadCast реализован следующим образом:

class AlarmReceiver : BroadcastReceiver() {

    override fun onReceive(context: Context?, intent: Intent?) {
        val extras = intent?.getExtras()
        val alarmId = intent?.getIntExtra("alarmId",-1)

        if(alarmId != null){
            val ta = MemoryManager.getAlarmWithId(alarmId.toInt())
            if(ta != null && ta!!.isSet){
                startAlarmActivity(context,alarmId)
            }
        }
    }

    private fun startAlarmActivity(context: Context?, alarmId: Int){
        try{
            val intent = Intent(context, AlarmDeactivation::class.java)
            intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)
            intent.putExtra("ALARM_ID", alarmId)
            intent.putExtra("ALARM_EXECUTION", 1)
            context?.startActivity(intent)
        }
        catch(e:Exception){
            val error = e
        }
    }

}

Функция startAlarmActivity запускает действие AlarmDeactivation, которое собирается остановить вибрацию и гудок.

Есть идеи, что я делаю неправильно ???

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...