#android #alarmmanager #android-pendingintent
#Android #alarmmanager #android-pendingintent
Вопрос:
У меня есть действие A, оно регистрирует AlarmManager для запуска другого BroadcastReceiver B. По истечении времени будет вызван onReceive () из B и запущено другое действие C. A может быть закрыт при запуске C.
Моя проблема в следующем: — C не знает PendingIntent в A, как я могу вызвать AlarmManager.cancel(PendingIntent) в C? — Или, как я могу передать PendingIntent из A в B в C?
Пожалуйста, помогите.
Ответ №1:
В моем приложении я создал статический метод, который возвращал PendingIntent
необходимое для AlarmManager
значение, а затем я могу вызвать его из любого класса. Если у вас есть PendingIntent
, который не меняется между вызовами, это может сработать для вас. Например, у меня есть:
public static PendingIntent getSyncPendingIntent(Context context)
{
Intent i = new Intent(context, <classname>.class);
PendingIntent pi = PendingIntent.getBroadcast(context, 0, i, 0);
return pi;
}
И я могу просто вызвать это из любого класса, чтобы получить то же самое PendingIntent
.
Комментарии:
1. Спасибо! Это работает 🙂 наконец, я объявляю AlarmManager и PendingIntent статическими и создаю статическую функцию cancel() в A.
2. Рад слышать, что это сработало: мне потребовалось некоторое время, чтобы придумать это, когда я столкнулся с такой же ситуацией.
3. Возникла проблема: Запустите AlarmManager в A -> Уничтожьте A с помощью Task Killer -> Сработал BroadcastReceiver B -> C -> Вызовите статический A.отмена(). статический AlarmManager и pindingIntent больше не существуют! Неожиданно остановлен и не может уничтожить намерение.
4. Диспетчер аварийных сигналов не может быть статичным. Вы хотите получать alarm manager каждый раз при использовании
getSystemService
, но используйте статический метод PendingIntent, чтобы каждый раз получать новый, идентичный PendingIntent.5. Спасибо, Феми! Я отлаживал свой зависающий виджет в течение нескольких дней. Я использовал диспетчер статических сигналов тревоги: P
Ответ №2:
Было бы намного проще управлять сигналом тревоги и его намерением в одноэлементном сервисе, чем пытаться передавать его от действия к действию, и гораздо менее хрупким (вы могли бы ввести Activity D где-нибудь посередине без необходимости в дальнейшем последовательном соединении намерений).
Ответ №3:
Вы можете зарегистрировать широковещательный приемник в A для прослушивания пользовательского действия, которое транслируется при запуске C
В действии A
private BroadcastReceiver onActivityCStartedReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
//cancel the pendingIntent for the alarm here
}
};
зарегистрируйте получателя
registerReceiver(onActivityCStartedReceiver , new IntentFilter(ACTIVITY_C_STARTED_ACTION));
При вызове Activity C
Intent i = new Intent(ACTIVITY_C_STARTED_ACTION);
context.sendBroadcast(i);
попробуйте! используйте систему обмена сообщениями для вашего блага: D
Комментарии:
1. Нужно ли поддерживать работу, чтобы AlarmManager и PendingIntent оставались неизменными? или объявлен как статический?
Ответ №4:
Чтобы отменить / уничтожить все службы, которые вы сгенерировали, обычно вам нужны те же переменные «pendingInetent» и «AlarmManager», которые вы использовали для запуска этих служб, например, если ваша предыдущая переменная — am_mngr и pndngInt, тогда используйте ее таким образом в вашем методе stopservice.
am_mngr.cancel(pndngInt); // this will cancel the previous servicse...