AlarmManager.AlarmClockInfo的PendingIntent如何工作?

21

我正在尝试使用AlarmManager.AlarmClockInfo来设置一个闹钟。

构造函数需要传入时间和一个PendingIntent,文档中对PendingIntent的描述为:

可用于显示或编辑闹钟详情的意图。

setAlarmClock()也需要传入一个PendingIntent,文档中对该参数的描述为:

闹钟响起时需要执行的操作。

我理解了setAlarmClock()如何使用PendingIntent,但是,AlarmClockInfo如何使用PendingIntent,我应该如何使用它来编辑闹钟的细节呢?

1个回答

32

然而,AlarmClockInfo如何使用PendingIntent?我该如何使用它来编辑闹钟的详细信息?

引用我自己在这本书中的话:

setAlarmClock()最大的问题是它对用户是可见的:

  • 用户会在状态栏中看到闹钟图标,就好像他们使用设备内置的闹钟应用程序设置了闹钟一样。

  • 当用户完全展开通知栏时,他们将看到闹钟的时间。

Notification Shade, Showing Upcoming Alarm

  • 在通知栏中点击闹钟时间将调用您放入AlarmClockInfo对象中的PendingIntent

因此,考虑到这段代码......:

  static void scheduleAlarms(Context ctxt) {
    AlarmManager mgr=
      (AlarmManager)ctxt.getSystemService(Context.ALARM_SERVICE);
    Intent i=new Intent(ctxt, PollReceiver.class);
    PendingIntent pi=PendingIntent.getBroadcast(ctxt, 0, i, 0);
    Intent i2=new Intent(ctxt, EventDemoActivity.class);
    PendingIntent pi2=PendingIntent.getActivity(ctxt, 0, i2, 0);

    AlarmManager.AlarmClockInfo ac=
      new AlarmManager.AlarmClockInfo(System.currentTimeMillis()+PERIOD,
        pi2);

    mgr.setAlarmClock(ac, pi);
  }
(来自这个示例项目)当用户在通知栏中点击时间时,将显示EventDemoActivity,您应该在此处提供一个活动,允许用户取消或重新安排此闹铃。

2
这个想法是,你应该提供一个活动,允许用户取消或重新安排这个闹钟。使用带有两个操作的“通知”(一个用于解除,一个用于打盹)不可以吗? - An SO User
@LittleChild:当然,如果你想要为用户提供两种管理闹钟的方式(Notification和由闹钟提供的活动),以及状态栏中的两个图标(一个用于Notification,另一个来自系统用于闹钟)。 - CommonsWare
@Ankhwatcher:这是一个非常好的问题...但我不知道。如果没有其他办法,您可以取消PendingIntent,但最好能够取消整个AlarmClockInfo,我不知道如何做到这一点。您可以尝试在Stack Overflow上提出另一个问题。 - CommonsWare
@CommonsWare 哦,我删掉了那个问题,因为它很愚蠢。你可以像平常一样删除以这种方式设置的闹钟,只需要使用与此示例中的“pi”相同的内容重新创建PendingIntent并调用cancel即可。 我之前认为你需要做其他的事情,因为当我实现它时,我的挂起意图混淆了。 - Ankhwatcher

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接