2011-05-09 72 views
4

我有一個活動A,它註冊AlarmManager以觸發另一個BroadcastReceiver B.當達到時間時,B的onReceive()將被調用,並啓動另一個活動C.當C啓動時A可能會關閉。如何停止AlarmManager

我的問題是: - C不知道A中的pendingIntent,我怎麼能在C中調用alarmManager.cancel(pendingIntent)? - 或者,我怎麼能通過pendingIntent從A到B到C?

請幫忙。

回答

0

在單件服務中管理警報及其意圖要比試圖將它從活動傳遞到活動要容易得多,而且不那麼脆弱(您可以在中間的某處引入活動D,而無需菊花鏈進一步的意圖)。

+0

thx您的建議:) – chow 2011-05-09 15:42:14

2

在我的應用程序中,我創建了一個靜態方法,返回AlarmManager所需的PendingIntent,然後我可以從任何類中調用它。如果你有一個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爲靜態,並在A中創建一個靜態的cancel()函數。 – chow 2011-05-09 15:43:48

+0

很高興聽到這樣的結果:花了一點時間想出來,當我碰到相同的情況。 – Femi 2011-05-09 15:47:09

+0

問題發生:在A中啓動AlarmManager - >由任務殺手殺死A - > BroadcastReceiver B觸發 - > C - >調用靜態A.cancel()。靜態alarmManager和pindingIntent不存在!意外停止,不能殺死意圖。 – chow 2011-05-09 16:04:38

0

您可以註冊的廣播接收器監聽當C開始

在活動正在廣播的自定義操作一個

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運行,以保持alarmManager和pendingIntent未更改?或聲明爲靜態? – chow 2011-05-09 15:40:59

0

要取消/銷燬您生成的所有服務,通常您需要與用於啓動這些服務的相同的「pendingInetent」和「AlarmManager」變量,例如,如果您的上一個變量是am_mngr和pndngInt,則在停止服務方法中使用它。

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