2013-05-26 30 views
0

在過去的兩天裏,我一直在試圖讓AlarmManager取消之前設置的鬧鈴,由於某些原因我無法使它工作。Android AlarmManager不會取消相同的Intents

我已經搜索了這個問題,最常見的解決方案是跟蹤舊的意圖,因爲只有那些,他們是可以取消的。

爲了解決這個問題,我決定創建我自己的Intent類,它是Serializable。

然後我將Intent類保存到一個「Intent.ser」文件中,然後調用那些來取消我的警報。

SerUitvalIntent.java

public class SerUitvalIntent extends Intent implements Serializable 
{ 

private String klas; 
private int delay; 
private Boolean uitvalBuzz; 
private Boolean algemeenBuzz; 

public SerUitvalIntent(Context context, Class<?> class1) 
{ 
    super(context, class1); 
} 

public void setBundle(Bundle b) 
{ 
    klas = b.getString(someClass.KLAS); 
    delay = b.getInt(someClass.DELAY); 
    uitvalBuzz = b.getBoolean(someClass.UITVALBUZZ); 
    algemeenBuzz = b.getBoolean(someClass.ALGEMEENBUZZ); 
} 

public Bundle getBundle() 
{ 
    Bundle b = new Bundle(); 
    b.putBoolean(someClass.UITVALBUZZ, uitvalBuzz); 
    b.putBoolean(someClass.ALGEMEENBUZZ, algemeenBuzz); 
    b.putString(someClass.KLAS, klas); 
    b.putInt(someClass.DELAY, delay); 
    return b; 
} 

/** 
* 
*/ 
private static final long serialVersionUID = 8289838097824161902L; 
} 

someClass.java

public static void schedule(Context context, long delay, Bundle data, Boolean startup) 
{ 
    DataHandler dHandle = new DataHandler(context, false); 
    final AlarmManager alarm = (AlarmManager) context.getSystemService(Context.ALARM_SERVICE); 

    SerUitvalIntent oldIntent = dHandle.getAlarm(); 

    if(oldIntent != null) 
    { 
     oldIntent.putExtra(BUNDLE, oldIntent.getBundle()); 
     oldIntent.putExtra(FROMUI, false); 
     Bundle b = oldIntent.getBundle(); 
     Log.i("AlarmManagerUitval", "Cancelled " + b.getString(KLAS) + "." + b.getInt(DELAY) + "." + b.getBoolean(UITVALBUZZ) + " alarm"); 
     final PendingIntent oldPending = PendingIntent.getService(context, 0, oldIntent, 0); 
     //Cancel latest alarm 
     alarm.cancel(oldPending); 
    } 


    final SerUitvalIntent intent = new SerUitvalIntent(context, UitvalService.class); 
    intent.setBundle(data); 
    dHandle.setAlarm(intent); 

    intent.putExtra(BUNDLE, data); 
    intent.putExtra(FROMUI, false); 

    final PendingIntent pending = PendingIntent.getService(context, 0, intent, 0); 

    Log.i("AlarmManagerUitval", "Started " + data.getString(KLAS) + "." + data.getInt(DELAY) + "." + data.getBoolean(UITVALBUZZ) + " alarm"); 
    long time; 

    if(startup) 
    { 
     time = SystemClock.elapsedRealtime(); 
    } 
    else 
    { 
     time = SystemClock.elapsedRealtime()+delay; 
    } 
    alarm.setRepeating(AlarmManager.ELAPSED_REALTIME, time,delay, pending); 
} 

我的logcat示出當警報被設置和取消相同的數據(Log.i()示出相同的數據) ,但不知何故它不會取消。

logcat的數據

05-26 14:21:00.108: I/AlarmManagerUitval(26041): Started v4.60000.true alarm 
05-26 14:21:00.178: I/UitvalService(26041): updating: v4 
(...) 
05-26 14:21:30.227: I/AlarmManagerUitval(26041): Cancelled v4.60000.true alarm 
05-26 14:21:30.237: I/AlarmManagerUitval(26041): Started h4.60000.true alarm 
05-26 14:21:30.307: I/UitvalService(26041): updating: h4 
(...) 
05-26 14:22:30.526: I/UitvalService(26104): updating: v4 
05-26 14:23:30.244: I/UitvalService(26104): updating: v4 

回答

0

我放棄了:P

我救,我想在報警一起發送的數據,並重新創建一個通用的意圖,每次我想取消前一個報警。

然後我調用了由警報調用的Intent上保存的數據。

如果有人莫名其妙地找到正確的答案,這個問題,我還是有興趣知道。 :)

Wampie