2011-05-09 107 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...