Я попробовал решение с XXX, и хотя он действительно работал, в какой-то момент он переставал работать. onReceive
больше не вызывали. Я часами пытался выяснить, что это может быть. Я понял, что Intent
по какой-то загадочной причине больше не называется. Чтобы обойти это, я обнаружил, что вам действительно нужно указать действие для получателя в манифесте. Пример:
<receiver android:name=".Alarm" android:exported="true">
<intent-filter>
<action android:name="mypackage.START_ALARM" >
</action>
</intent-filter>
</receiver>
Обратите внимание, что это имя ".Alarm"
с периодом. В методе XXX setAlarm
создайте Intent
следующим образом:
Intent i = new Intent("mypackage.START_ALARM");
Сообщение START_ALARM
может быть любым, каким вы хотите. Я просто дал это имя для демонстрационных целей.
Я не видел получателей, определенных в манифесте, без фильтра намерений, который определяет действие. Создавая их так, как указал XXX, он кажется вроде поддельным. Указав имя действия, Android будет вынужден создать экземпляр BroadcastReceiver
, используя класс, соответствующий действию. Если вы полагаетесь на контекст, имейте в виду, что Android имеет несколько разных объектов, которые все называются контекстом и не могут привести к созданию вашего BroadcastReceiver
. Принуждение Android к созданию экземпляра вашего класса с использованием только сообщения о действиях намного лучше, чем полагаться на некоторый контекст iffy, который может никогда не работать.