アプリケーションロジックの異なる瞬間に呼び出される2つの異なる方法でアラームを作成および削除しようとしています。
ただし、AlarmManagerのcancel()
メソッドを呼び出しても、アラームは削除されません。
これは私のaddAlarm()
メソッドです:
_AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(PROX_ALERT_INTENT);
intent.putExtra("ALERT_TIME", alert.date);
intent.putExtra("ID_ALERT", alert.idAlert);
intent.putExtra("TITLE", alert.title);
intent.putExtra("GEO_LOC", alert.isGeoLoc);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
alert.idAlert, intent, PendingIntent.FLAG_CANCEL_CURRENT);
Calendar calendar = Calendar.getInstance();
calendar.setTime(alert.date);
alarmManager.set(AlarmManager.RTC_WAKEUP, calendar.getTimeInMillis(), pendingIntent);
Log.e("ADD ALERT - WithoutGeoLoc - ",alert.toString());
_
ここに私のdeleteAlarm()メソッドがあります:
_AlarmManager alarmManager = (AlarmManager) mContext.getSystemService(Context.ALARM_SERVICE);
Intent intent = new Intent(PROX_ALERT_INTENT);
intent.putExtra("ALERT_TIME", alert.date);
intent.putExtra("ID_ALERT", alert.idAlert);
intent.putExtra("TITLE", alert.title);
intent.putExtra("GEO_LOC", alert.isGeoLoc);
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
alert.idAlert, intent, PendingIntent.FLAG_CANCEL_CURRENT);
alarmManager.cancel(pendingIntent);
Log.e(TAG,"REMOVE ALERT - without GeoLoc"+alert.toString());
_
ここに私のLogcatがあります:
_01-23 17:44:07.411: E/ADD ALERT - WithoutGeoLoc -(18789): Alert [latitude=0.0, longitude=0.0, title=bfwu, comments=null, address=null, currency=hrk, idAlert=1, date=Sat Feb 23 17:44:04 CET 2013, isGeoLoc=null]
01-23 17:44:13.032: E/REMOVE ALERT without GeoLoc - (18789): Alert [latitude=0.0, longitude=0.0, title=bfwu, comments=null, address=null, currency=hrk, idAlert=1, date=Sat Feb 23 17:44:04 CET 2013, isGeoLoc=null]
_
AlarmManagerのpendingIntentsのリスト
_Current Alarm Manager state:
Realtime wakeup (now=2013-01-23 17:44:37):
RTC_WAKEUP #48: Alarm{2c1d0588 type 0 com.my.app}
type=0 when=+364d23h59m33s288ms repeatInterval=0 count=0
operation=PendingIntent{2c0a6cb0: PendingIntentRecord{2c1d04e8 com.my.app broadcastIntent}}
RTC_WAKEUP #47: Alarm{2c2298a0 type 0 com.my.app}
type=0 when=+30d23h59m27s360ms repeatInterval=0 count=0
operation=PendingIntent{2c292af8: PendingIntentRecord{2c22a628 com.my.app broadcastIntent}}
_
いくつかのメモ:
RTC_WAKEUP #47
_は私の元のアラームですRTC_WAKEUP #48
_は、新しいアラームを作成するのではなく、#47を上書きする必要がある新しいアラームです。true
を返すIntentのfilterEquals()
メソッドを使用して、addメソッドとdeleteメソッドの2つのインテント(pendingIntentsではありません)を比較しました...しかし、アラームは削除されません。私は何を間違えていますか?
[〜#〜] update [〜#〜]
ここにsaveAlert()
とaddAlarm()
を呼び出すdeleteAlarm()
メソッドがあります
_private void saveAlert() {
// *** If Modifying Alert => REMOVE OLD ALERT (then add new one)
Intent intent1 = null, intent2 = null;
if (alert.idAlert != null) {
if (alert.isGeoLoc == null || alert.isGeoLoc == false) {
intent2 = ProximityService.removeProximityAlertWithoutGeoLoc(getApplicationContext(), devisesApp.alertsGlobal.getAlertById(alert));
} else {
ProximityService.removeProximityAlert(getApplicationContext(), alert);
}
}
// *** Add Alert
if (alert.isGeoLoc == null || alert.isGeoLoc == false) {
intent1 = ProximityService.addProximityAlertWithoutGeoLoc(getApplicationContext(), alert, devisesApp.alertsGlobal);
} else {
ProximityService.addProximityAlert(getApplicationContext(), alert, devisesApp.alertsGlobal);
}
Log.i(TAG, "[saveAlert] Alert ID : " + alert.idAlert);
devisesApp.alertsGlobal.addById(alert);
Log.i("INTENT EQUALS", intent1.filterEquals(intent2) + ""); // This returns true
}
_
このフラグを試してください:
PendingIntent.FLAG_UPDATE_CURRENT
の代わりに:
PendingIntent.FLAG_CANCEL_CURRENT
したがって、PendingIntentは次のようになります。
PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext,
alert.idAlert, intent, PendingIntent.FLAG_UPDATE_CURRENT)
(同じalert
オブジェクトとmContext
!を使用していることを確認してください。)
補足:グローバルなAlarmManagerが1つ必要な場合は、AlarmManagerを静的変数に入れます(null
の場合にのみ初期化します)。
アラームのキャンセルは少しわかりにくいです。同じIDとIntentPendingを渡す必要があります。以下に例を示します。
private void resetIntentWithAlarm(int time){
Intent intentAlarm = new Intent(getApplicationContext(), DownloadService.class);
intentAlarm.putExtra(Your Key, Your stuff to pass here);
AlarmManager alarmManager = (AlarmManager) getSystemService(Context.ALARM_SERVICE);
PendingIntent pendingIntent = PendingIntent.getService(
getApplicationContext(),
YOUR_ID,
intentAlarm,
PendingIntent.FLAG_UPDATE_CURRENT
);
if (time != 0) {
alarmManager.setRepeating(AlarmManager.RTC_WAKEUP, System.currentTimeMillis() + (60L * 1000L * time), (60L * 1000L * time), pendingIntent);
Log.i(TAG, "Alarm setted on for " + time + " mins.");
}
// if TIME == Zero, cancel alaram
else {
alarmManager.cancel(pendingIntent);
Log.i(TAG, "Alarm CANCELED. Time = " + time);
}
設定した特定の時間にアラームマネージャからアラームをキャンセルします。
Intent intent = new Intent(context, AlarmReceiver.class);
PendingIntent pendingIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_CANCEL_CURRENT);
AlarmManager am = (AlarmManager) context.getSystemService(ALARM_SERVICE);
am.cancel(pendingIntent);