У меня проблема с приемником вещания моего приложения, что сводит меня с ума.
Я реализую приложение с целью быть простым утренним будильником, с некоторыми логиками 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, которое собирается остановить вибрацию и гудок.
Есть идеи, что я делаю неправильно ???