2011-05-09 10 views
4

У меня есть активность A, он регистрирует AlarmManager для запуска другого BroadcastReceiver B. По достижении времени вызывается onReceive() из B и запускает другое действие C. A может быть закрыто при запуске C ,Как остановить AlarmManager

Моя проблема: - C не знаю, как pendingIntent в A, как я могу вызвать alarmManager.cancel (pendingIntent) в C? - Или, как я могу передать pendingIntent от A до B к C?

Помощь Pls.

ответ

0

Было бы намного легче управлять сигналом тревоги и его намерением в одном сингл-службе, чем пытаться передать его от активности к активности и гораздо менее хрупким (вы могли бы ввести Activity D где-то посередине, не создавая цепочку намерение далее).

+0

thx для вашего совета :) – chow

2

В моем приложении я создал статический метод, который возвращал 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.

+0

Thx! Это работа :) В конце концов, я объявляю как alarmManager, так и pendingIntent статичным и создаю функцию static cancel() в A. – chow

+0

Рад, что это получилось: мне потребовалось немного времени, чтобы придумать это, когда я столкнулся с тем же ситуация. – Femi

+0

Проблема: Запустите AlarmManager в A -> Убейте A от Killer -> BroadcastReceiver B triggered -> C -> Вызов static A.cancel(). статический alarmManager и pindingIntent уже не существует! Неожиданно остановился и не может убить намерение. – chow

0

Вы можете зарегистрировать приемник широковещательной передачи в прослушивать пользовательские действия, которое транслируется, когда С начала

в деятельности по

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)); 

В Деятельность C вызов

Intent i = new Intent(ACTIVITY_C_STARTED_ACTION); 
context.sendBroadcast(i); 

попробуйте! используйте систему обмена сообщениями для вашего товара: D

+0

Нужно ли держать A running, чтобы keepManager и pendingIntent не менялись? или объявлен как статический? – chow

0

Чтобы отменить/уничтожить все службы, которые вы сгенерировали, вам обычно нужны те же переменные «pendingInetent» и «AlarmManager», которые вы использовали для запуска этих служб, , например, если ваша предыдущая переменная - am_mngr и pndngInt, то используйте ее таким образом в методе stopervice.

am_mngr.cancel(pndngInt); // this will cancel the previous servicse... 

 Смежные вопросы

  • Нет связанных вопросов^_^