42

アプリケーション ロジックで異なるタイミングで呼び出される 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 を上書きする必要がある新しいアラームです。

filterEquals()返されるインテントのメソッドを使用して、追加メソッドと削除メソッドの 2 つのインテント (pendingIntents ではない) を比較しましたtrue... それでも、アラームは削除されません。私は何を間違っていますか?


アップデート

を呼び出す私の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
}
4

4 に答える 4

49

このフラグを試してください:

PendingIntent.FLAG_UPDATE_CURRENT

それ以外の:

PendingIntent.FLAG_CANCEL_CURRENT 

したがって、PendingIntentは次のようになります。

PendingIntent pendingIntent = PendingIntent.getBroadcast(mContext, 
        alert.idAlert, intent, PendingIntent.FLAG_UPDATE_CURRENT)  

alert(必ず同じオブジェクトを使用してくださいmContext!)

補足:1つのグローバルAlarmManagerが必要な場合は、AlarmManagerを静的変数に入れます(そして、そうである場合にのみ初期化しますnull)。

于 2013-01-24T09:55:13.573 に答える