2012-10-23 78 views
2

我有一個導航應用程序。我想獲取可能不會持續一段時間的頭寸信息,具體取決於GPS需要多長時間才能鎖定 - 或者如果接收質量不佳。如何取消PendingIntent

我打算使用LocationManager.requestLocationUpdates()來請求位置信息發送到BroadcastReciever只要它變得可用,並通過AlarmManager.set()也設置超時。

如果位置更新到達,我想取消超時。如果超時到達,我想取消位置更新。假設我的應用程序可能會在發生任何事情之前被殺害,那麼我會因爲我想取消的事情而丟失PendingIntent

有沒有辦法以某種方式保存PendingIntent,所以我可以使用它們取消稍後的超時和/或位置更新?或者有更好的方法去解決這個問題嗎?

回答

2

您不需要保存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操作只能匹配)。

所以基本上只是使用相同的動作來創建意圖設置/取消報警,它會工作。

+0

太棒了;讓我試試看。 –

+0

好吧,它工作得很好;謝謝。我在測試時學到了一個重要的課程:如果您*不*取消位置更新,世界上沒有任何東西會讓GPS退出,直到您重新啓動手機。即使卸載應用程序也不起作用。如果系統知道要取消它知道永遠不會收到的廣播,那將會很不錯。 –

相關問題