Я пишу простое приложение-напоминание. Все напоминания хранятся в БД. У меня есть служба, которая запрашивает БД и делает pendingIntents в AlarmManager с дополнительными функциями и разными временными метками. Также у меня есть широковещательный приемник, чтобы поймать намерения от AlarmManager. Этот широковещательный приемник запускает действие напоминания с вариантами напоминания (закрыть, отложить и т. д.). Теперь эта схема работает, но не так хорошо, как я думаю. Если у меня есть действие напоминания на переднем плане, то новое действие напоминания начинается с него (текущее уходит в фоновый режим). Я хочу не переопределять текущую активность новой и просто уведомлять пользователя о том, что есть новые напоминания, которые будут отображаться после текущей.
Многие PendingIntents, BroadcastReceiver и активность
Ответы (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 и все еще присутствующая. Так что теперь это фича :)
Извините за мой английский, мне легко читать, но трудно писать :)