获取Android OS中已注册的待处理意图列表

时间:2012-11-08 15:28:56

标签: android

我注册了我计划在给定时间执行的警报,根据预定列表的大小,它可以是多个警报。但我有两个问题对我来说还不清楚:

1)如何查询操作系统中的Pending Intents I寄存器?我需要这个来测试。我想要的psudo代码是这样的:

List<PendingIntent> intentsInOS = context.getAllPendingIntentsOfType(AppConstants.INTENT_ALARM_SCHEDULE));

2)查看我创建的待处理意图,我提供了一个动作和额外数据(计划ID)。

private Intent getSchedeuleIntent(Integer id) {

    Intent intent = new Intent(AppConstants.INTENT_ALARM_SCHEDULE);
    intent.putExtra(AppConstants.INTENT_ALARM_SCHEDULE_EXTRA, id);

    return intent;
}

但我们也说意图有FLAG_CANCEL_CURRENT。它会取消所有具有相同操作的待处理意图,还是同时具有相同的操作和额外数据?

PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, getSchedeuleIntent(schedule.id), PendingIntent.FLAG_CANCEL_CURRENT);

我的代码

@Override
public void run() {

    List<ScheduledLocation> schedules = dbManager.getScheduledLocations();
    if(schedules == null || schedules.isEmpty()){
        return;
    }

    AlarmManager alarmManager = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE);
    //alarmManager.

    // we need to get the number of milliseconds from current time till next hour:minute the next day.
    for(ScheduledLocation schedule : schedules){

        long triggerAtMillis = DateUtils.millisecondsBetweenNowAndNext(now, schedule.hour, schedule.minute, schedule.day);
        PendingIntent pendingIntent = PendingIntent.getBroadcast(context.getApplicationContext(), 0, getSchedeuleIntent(schedule.id), PendingIntent.FLAG_CANCEL_CURRENT);

        alarmManager.setInexactRepeating(AlarmManager.ELAPSED_REALTIME_WAKEUP, triggerAtMillis, MILLISECONDS_IN_WEEK, pendingIntent);
    }

    // List<PendingIntent> intentsInOS = context.getAllPendingIntentsOfType(AppConstants.INTENT_ALARM_SCHEDULE));

}


private Intent getSchedeuleIntent(Integer id) {

    Intent intent = new Intent(AppConstants.INTENT_ALARM_SCHEDULE);
    intent.putExtra(AppConstants.INTENT_ALARM_SCHEDULE_EXTRA, id);

    return intent;
}

1 个答案:

答案 0 :(得分:9)

1如何查询操作系统中的Pending Intents I寄存器?

我不确定您是否可以,但您可以检查特定PendingIntent是否已注册:

private boolean checkIfPendingIntentIsRegistered() {
    Intent intent = new Intent(context, RingReceiver.class);
    // Build the exact same pending intent you want to check.
    // Everything has to match except extras.
    return (PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE) != null);
}

2它会取消所有具有相同操作的待处理意图,还是同时执行相同操作和额外数据?

它将取消所有被解析为相等的PendingIntent

等于究竟是什么意思?

android的java doc说:

  

为了意图的目的,确定两个意图是否相同   分辨率(过滤)。也就是说,如果他们的行动,数据,类型,类,   和类别是一样的。这比较任何额外的   包含在意图中的数据。

您可以在7391行阅读:https://android.googlesource.com/platform/frameworks/base/+/refs/heads/master/core/java/android/content/Intent.java

总而言之,除了额外内容之外,所有构建完全相同的PendingIntent都将被取消。