我使用 AlarmManager 来安排多个任务,即任务 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 调度已经有一个警报(两个 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)
,以便我可以根据 Extras 区分 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
不会调用 overriden 。