您不需要保存PendingIntent實例本身。 AlarmManager.cancel的文檔(PendingIntent操作)說,
刪除任何具有匹配意圖的警報。任何類型的意圖與其匹配的警報(由filterEquals(Intent)定義)將被取消。
如果你看看Intent.filterEquals(意向),它說,
確定兩個意圖是意圖分辨率(過濾)的目的是相同的。也就是說,如果他們的行爲,數據,類型,類別和類別相同。這並不比較意圖中包含的任何額外數據。
因此,您可以使用相同的操作創建一個PendingIntent,並使用該新的掛起的意圖執行am.cancel(),同時它也將取消前一個掛起的意圖。
下面是一個簡單的代碼示例:
private static final String ALARM_ACTION = "foo.bar.MY_ALARM_ACTION";
private PendingIntent getAlarmIntent() {
Intent alarmIntent = new Intent(ALARM_ACTION);
PendingIntent pi = PendingIntent.getBroadcast(this, 0, alarmIntent, PendingIntent.FLAG_UPDATE_CURRENT); // or whatever flag you need
return pi;
}
現在你可以調用am.set()用的PendingIntent從上面的函數返回,也叫am.cancel()用的PendingIntent從返回同樣的功能。 PendingIntent是否是相同的實例並不重要,它只需要匹配Intent.filterEquals()測試(因此基本上只是Intent操作只能匹配)。
所以基本上只是使用相同的動作來創建意圖設置/取消報警,它會工作。
太棒了;讓我試試看。 –
好吧,它工作得很好;謝謝。我在測試時學到了一個重要的課程:如果您*不*取消位置更新,世界上沒有任何東西會讓GPS退出,直到您重新啓動手機。即使卸載應用程序也不起作用。如果系統知道要取消它知道永遠不會收到的廣播,那將會很不錯。 –