У меня есть широковещательный приемник, запускающийся после перезагрузки, чтобы установить несколько будильников с помощью диспетчера тревог.
Передача и прием после перезагрузки работают отлично, однако сигнал тревоги, установленный в этой передаче, выдает ошибку при срабатывании.
E/AndroidRuntime(4330): at mobileTechnology.geoCalendar.SetAlarm.checkReminder(SetAlarm.java:82)
E/AndroidRuntime(4330): at mobileTechnology.geoCalendar.SetAlarm.access$1(SetAlarm.java:80)
E/AndroidRuntime(4330): at mobileTechnology.geoCalendar.SetAlarm$1.gotLocation(SetAlarm.java:73)
E/AndroidRuntime(4330): at mobileTechnology.geoCalendar.CurrentLocation$2.onLocationChanged(CurrentLocation.java:70)
Когда я открываю приложение после перезагрузки до того, как сработают другие тревоги, ошибки не будет.
У вас есть идея, почему приложение ведет себя так? В приемнике вещания я получаю доступ к обычному классу Java (без активности), чтобы определить текущую позицию с помощью обратного вызова.
Есть ли проблема с доступом к этому классу, когда приложение не было открыто раньше?
РЕДАКТИРОВАТЬ: Я предполагаю, что я настроил мой файл манифеста неправильно, поскольку отсутствует фильтр намерений. Может кто-нибудь сказать мне, как правильно это сделать?
<receiver android:name="SetAlarm"></receiver>
EDIT2:
спасибо, вот еще код моего проекта:
Во время выполнения настроить несколько аварийных сигналов для событий с помощью диспетчера аварийных сигналов. Тревога создается по телефону
new SetAlarm (Context context, Bundle bundle, Long time_how_far_in_advance_alarm_should_be_fired)
Пакет содержит подробную информацию о событии (имя, время ...), а конструктор SetAlarm выглядит следующим образом:
AlarmManager alarmMgr = (AlarmManager)context.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(context, SetAlarm.class);
intent.putExtra("data", bundle);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, bundle.getInt("id"), intent,PendingIntent.FLAG_UPDATE_CURRENT);
Calendar cal = Calendar.getInstance();
*<set time for reminder>*
alarmMgr.set(AlarmManager.RTC_WAKEUP, cal.getTimeInMillis(),
pendingIntent);
Приемник относится к тому же классу, что и вещание, и определяется
<receiver android:name="SetAlarm"></receiver>
До этого момента все работает отлично, так как срабатывает сигнализация, когда она должна быть, и отображается уведомление.
Для перезагрузки сигналов тревоги после перезагрузки есть еще один класс ReloadAlarms, загружающий все события из базы данных и заново настраивающий сигналы тревоги.
public void onReceive(Context context, Intent intent)
<receiver android:name="ReloadAlarms" >
<intent-filter >
<action android:name="android.intent.action.BOOT_COMPLETED" />
</intent-filter>
</receiver>
Аварийные сигналы устанавливаются снова путем вызова SetAlarm и передачи контекста, только что полученного от первого метода при получении.
SetAlarm (контекстный контекст, комплектация, длинное напоминание)
Как только вызывается метод onReceive в SetAlarm, он проверяет, нужно ли установить будильник на другое время. Если да, я звоню
новый SetAlarm (_context, newBundle, newTime);
_context - это снова контекст, который я только что получил от метода onReceive.
Проблема в том, что метод onReceive вызывается непрерывно. (по крайней мере, в случае необходимости переназначения мероприятия, даже без перезагрузки)
Как метод onReceive распознает, когда сработала сигнализация. Возможно ли, что это происходит, потому что я передаю контекст, полученный методом onReceive, новому SetAlarm (...) для перепланирования?
END Edit2
Спасибо за помощь!