2014-09-24 48 views
1

我試圖取消一個pendingIntent,所以總是隻有一個。根據服務是開始還是停止,我的requestCode是「1」或「2」。該對的PendingIntent啓動報警看起來像這樣(停止幾乎是相同的):用獨特的ReqestCode取消PendingIntent

Intent i = new Intent(context, Service.class); 
i.setAction("start"); 
PendingIntent pi = PendingIntent.getService(context, SaveSchedulePrefs.getStartReqCode(context), i, PendingIntent.FLAG_UPDATE_CURRENT); 
alarmManager.cancel(pi) 

新的PendingIntent看起來是這樣的:

alarmManager.setExact(AlarmManager.RTC_WAKEUP, mTime, pi); 

從我讀過的的PendingIntent必須是完全相同以便被取消並且1的requestCode應該滿足該需求。這實際上可能是因爲預期工作,但是從警報再次觸發多天的日誌文件顯示以下兩個啓動/停止報警(各7個出現次數):

RTC_WAKEUP #0: Alarm{b216a768 type 0 com.myapp.myRinger} 
operation=PendingIntent{b2169318: PendingIntentRecord{b20e5820 com.myapp.myRinger startService}} 
    RTC_WAKEUP #0: Alarm{b2172ed0 type 0 com.myapp.myRinger} 
operation=PendingIntent{b2172ec0: PendingIntentRecord{b20e6160 com.myapp.myRinger startService}} 
    com.myapp.myRinger +856ms running, 14 wakeups: 
+759ms 7 wakes 7 alarms: act=stop cmp={com.myapp.myRinger/com.myapp.myRinger.Service} 
+758ms 7 wakes 7 alarms: act=start cmp={com.myapp.myRinger/com.myapp.myRinger.Service} 

是我所看到的記錄已經被激活的報警的歷史記錄,或者沒有一個報警被取消?

回答

1

它看起來像您的原始PendingIntent已得到ACTION =「開始」或ACTION =「停止」。在您發佈的代碼中,PendingIntent不包含行動。在這種情況下,它不會匹配(所以它不會取消警報)。

爲了使PendingIntent匹配,以下內容必須匹配:ACTION,DATA,COMPONENT。出於匹配目的,不會比較意圖附加項並將其忽略。

+0

我已將以下setAction方法添加到上面:'i.setAction(「start」);',但我仍然看到相同的日誌結果。所以現在我有一個匹配的請求代碼和匹配的操作。難道是我看到的日誌輸出是正常的,報警實際上被取消了嗎? – Futureproof 2014-10-01 18:08:33

+0

如果您不確定警報是否關閉,請在警報關閉時向文件中添加一些調試日誌記錄。那麼你就會確定,你不必依靠做出假設。 – 2014-10-01 18:54:29