私は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);
奇妙なことに、アラームを1つ設定すると、うまく機能します。2つ設定すると、最後のアラームのみが発生します。したがって、問題は、2番目、3番目...のアラームを設定すると、前のアラームが上書きされることだと思います。
開発者向けドキュメントから:
スケジュールされたこのインテントのアラームがすでに存在する場合(filterEquals(Intent)によって定義されている2つのインテントが等しい場合)、それは削除され、このインテントに置き換えられます。
私はソースに行きました、これがそのメソッドの実装です:
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)
エクストラに基づいてインテントを区別できるように、をオーバーライドするにはどうすればよいですか?
これが私の実装です:
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