为AlarmManager设置多个Intent

时间:2012-07-24 12:03:16

标签: android android-intent android-alarms

我使用AlarmManager安排多个tak,即任务1在10:56,任务2在11:24,依此类推。 这是代码:

  intent = new Intent(ACTION_RECORDER_START);
  intent.putExtra(EXTRA_COMMAND_ID, command.id);
  pendingIntent = PendingIntent.getService(context, 0, intent, PendingIntent.FLAG_ONE_SHOT);
  alarmManager.set(AlarmManager.RTC_WAKEUP, command.start, pendingIntent);

这是奇怪的事情:如果我设置了一个警报,它就能很好地工作。如果我设置了两个,则只触发最后一个警报。 所以,我想问题是,当我设置第二个,第三个...警报时,先前被覆盖。

来自开发者文档:

  

如果已安排此Intent的警报(使用   那么两个意图的相等性由filterEquals(Intent))定义   它将被移除并由此替换。

我去了消息来源,这是该方法的实现:

public boolean filterEquals(Intent other) {
        if (other == null) {
            return false;
        }
        if (mAction != other.mAction) {
            if (mAction != null) {
                if (!mAction.equals(other.mAction)) {
                    return false;
                }
            } else {
                if (!other.mAction.equals(mAction)) {
                    return false;
                }
            }
        }
        if (mData != other.mData) {
            if (mData != null) {
                if (!mData.equals(other.mData)) {
                    return false;
                }
            } else {
                if (!other.mData.equals(mData)) {
                    return false;
                }
            }
        }
        if (mType != other.mType) {
            if (mType != null) {
                if (!mType.equals(other.mType)) {
                    return false;
                }
            } else {
                if (!other.mType.equals(mType)) {
                    return false;
                }
            }
        }
        if (mPackage != other.mPackage) {
            if (mPackage != null) {
                if (!mPackage.equals(other.mPackage)) {
                    return false;
                }
            } else {
                if (!other.mPackage.equals(mPackage)) {
                    return false;
                }
            }
        }
        if (mComponent != other.mComponent) {
            if (mComponent != null) {
                if (!mComponent.equals(other.mComponent)) {
                    return false;
                }
            } else {
                if (!other.mComponent.equals(mComponent)) {
                    return false;
                }
            }
        }
        if (mCategories != other.mCategories) {
            if (mCategories != null) {
                if (!mCategories.equals(other.mCategories)) {
                    return false;
                }
            } else {
                if (!other.mCategories.equals(mCategories)) {
                    return false;
                }
            }
        }

        return true;
    }

所以,据我所知,没有提及额外内容。事实上,我依靠这个:

intent.putExtra(EXTRA_COMMAND_ID, command.id);

但标准实施并不比较exras。 因此,当我安排多个意图时,它们会被比较相等并被覆盖!

实际问题:

如何覆盖filterEquals(Intent),以便我可以根据额外内容区分Intent?

这是我的实施:

 static class AlarmIntent extends Intent{

        public AlarmIntent(String action){
            super(action);
        }

        @Override
        public boolean filterEquals(Intent other){
            if(super.filterEquals(other)){
                long id  = getExtras().getLong(AudioRecorder.EXTRA_COMMAND_ID, -1);
                long otherId = other.getExtras().getLong(AudioRecorder.EXTRA_COMMAND_ID, -1);
                if(id == otherId){
                    return true;
                }
            }
            return false;
        }
    }

但在我看来它不起作用。我认为不会调用覆盖filterEquals

1 个答案:

答案 0 :(得分:0)

结束了这个:

pendingIntent = PendingIntent.getService(context, UNIQUE_ID, intent, PendingIntent.FLAG_ONE_SHOT);

getService提供第二个参数完成了这项工作。