【问题标题】:How to stop AlarmManager如何停止警报管理器
【发布时间】:2011-05-09 14:32:11
【问题描述】:

我有一个activity A,它注册了AlarmManager来触发另一个BroadcastReceiver B。到了时间,B的onReceive()会被调用,并启动另一个activity C。当C启动时A可能会被关闭。

我的问题是: - C 不知道 A 中的 pendingIntent,如何在 C 中调用 alarmManager.cancel(pendingIntent)? - 或者,我如何将 pendingIntent 从 A 传递到 B 到 C?

请帮忙。

【问题讨论】:

    标签: android alarmmanager android-pendingintent


    【解决方案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

    【讨论】:

    • 谢谢!它的工作:) 最后,我将 alarmManager 和 pendingIntent 都声明为静态,并在 A 中创建一个静态 cancel() 函数。
    • 很高兴听到这个结果:当我遇到同样的情况时,我花了一点时间才想出来。
    • 问题发生:在 A 中启动 AlarmManager -> 由 Task Killer 杀死 A -> BroadcastReceiver B 触发 -> C -> 调用静态 A.cancel()。静态的 alarmManager 和 pindingIntent 不再存在!意外停止,无法终止意图。
    • 报警管理器不能是静态的。您希望每次都使用getSystemService 获取警报管理器,但使用静态 PendingIntent 方法每次都获取一个新的、相同的 PendingIntent。
    • 谢谢费米!几天来,我一直在调试崩溃的小部件。我使用的是静态警报管理器:P
    【解决方案2】:

    在单例服务中管理警报及其意图要比尝试将它从一个活动传递到另一个活动要容易得多,而且也不那么脆弱(您可以在中间的某个地方引入活动 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

      【讨论】:

      • 是否需要保持A运行,保持alarmManager和pendingIntent不变?还是声明为静态的?
      【解决方案4】:

      要取消/销毁您生成的所有服务,通常您需要用于启动这些服务的相同“pendingInetent”和“AlarmManager”变量, 例如,如果您之前的变量是 am_mngr 和 pndngInt,那么在您的 stopservice 方法中像这样使用它。

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

      【讨论】:

        猜你喜欢
        • 2012-01-29
        • 2017-03-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多