Многие PendingIntents, BroadcastReceiver и активность

Я пишу простое приложение-напоминание. Все напоминания хранятся в БД. У меня есть служба, которая запрашивает БД и делает pendingIntents в AlarmManager с дополнительными функциями и разными временными метками. Также у меня есть широковещательный приемник, чтобы поймать намерения от AlarmManager. Этот широковещательный приемник запускает действие напоминания с вариантами напоминания (закрыть, отложить и т. д.). Теперь эта схема работает, но не так хорошо, как я думаю. Если у меня есть действие напоминания на переднем плане, то новое действие напоминания начинается с него (текущее уходит в фоновый режим). Я хочу не переопределять текущую активность новой и просто уведомлять пользователя о том, что есть новые напоминания, которые будут отображаться после текущей.


person Sergey Grabak    schedule 08.02.2013    source источник


Ответы (1)


Как мне кажется, я нашел хорошее решение для своей задачи:

1) Я установил в AndroidManifest, что мой режим запуска напоминания - «singleTop». Подробнее о launchMode можно узнать здесь http://developer.android.com/guide/topics/manifest/activity-element.html В двух словах, если мой широковещательный приемник пытается запустить действие, которое уже находится на переднем плане, он вызывает onNewIntent, а не onCreate.

2) В своей деятельности я должен переопределить метод onNewIntent и сохранить все входящие намерения (из трансляции) в ArrayList .

3) Перед завершением () я должен удалить текущее намерение из ArrayList, и когда его размер станет равным нулю, я фактически закончу () действие.

Одно важное дополнение. В намерении широковещательного приемника должно быть указано FLAG_ACTIVITY_SINGLE_TOP, например:

намерение.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_SINGLE_TOP);

Без него, если никакая основная активность onNewIntent не будет вызываться. Как я вижу, это известная проблема: http://code.google.com/p/android/issues/detail?id=4155 Ошибка, обнаруженная в Android 1.6 и все еще присутствующая. Так что теперь это фича :)

Извините за мой английский, мне легко читать, но трудно писать :)

person Sergey Grabak    schedule 10.02.2013