Получатель широковещательной рассылки выдает ошибку после перезагрузки, когда приложение не было открыто ранее - PullRequest
1 голос
/ 01 декабря 2011

У меня есть широковещательный приемник, запускающийся после перезагрузки, чтобы установить несколько будильников с помощью диспетчера тревог. Передача и прием после перезагрузки работают отлично, однако сигнал тревоги, установленный в этой передаче, выдает ошибку при срабатывании.

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

Спасибо за помощь!

Ответы [ 2 ]

1 голос
/ 01 декабря 2011

Вам нужно показать как можно больше кода, если вам нужна помощь от нас ... мы работаем в темноте прямо сейчас ... попробуйте поместить это в манифест как намерение: <intent-filter > <action android:name="android.intent.action.BOOT_COMPLETED"/> <category android:name="android.intent.category.HOME"/> </intent-filter>

0 голосов
/ 01 декабря 2011

хорошо, я наконец-то обнаружил ошибку ... проблема была в том, что я не инициализировал настройки Singleton после перезагрузки. Я реализовал функцию initializeSetting, которая вызывается в моей основной деятельности. Я думал, что это из-за реализации вещательного приемника все время ....

Теперь я инициализирую настройки (если это еще не произошло) также в приемнике вещания, и это работает.

Глупая ошибка, которая стоила мне часов -.-

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