2011-09-21 35 views
20

我使用AlarmManager來設置重複的意圖,但它已經造成了一些小麻煩,所以希望任何人都可以提供幫助。如何創建不同的pendingintent所以filterEquals()返回false?

摘要

有2個未決意圖。一個運行在1000,另一個運行在2000,每天。每個數據庫都包含來自數據庫的行標識以用於標識。該代碼看起來是這樣的:

Intent i = new Intent(mContext, ScheduleReceiver.class); 
i.putExtra(RuleDBAdapter.KEY_ROWID, (int)taskId); 
PendingIntent pi =PendingIntent.getBroadcast(...); 
mAlarmManager.set(AlarmManager.RTC_WAKEUP, when.getTimeInMillis(), pi); 

刪除:

的問題是,當我們需要刪除其中之一。刪除掛起的意圖的正確方法是設置相同的一個,然後從AlarmManager中調用取消。

Android文檔:

public void cancel (PendingIntent operation)
具有匹配的意圖刪除任何警報。任何類型的意圖與其匹配的警報(由filterEquals(Intent)定義)將被取消。

public boolean filterEquals (Intent other)
確定是否兩個目的是意圖分辨率(濾波)的目的是相同的。也就是說,如果他們的行爲,數據,類型,類別和類別相同。此不會比較意圖中包含的任何額外數據

所以在上面的例子,如果我做相同的意圖再取消,上述兩種意圖將被取消,因爲他們是來自同一個類/同樣的動作等(除了「額外」數據是rowId,但filterEquals不關心額外的數據)。

有沒有解決方法?

回答

23

創建掛起的意圖時,您可以嘗試使用requestCode參數:

PendingIntent pi =PendingIntent.getBroadcast(mContext, yourUniqueDatabaseId,i,PendingIntent.FLAG_ONE_SHOT); 

這應該創建一個Intent是進行匹配獨特..

+0

謝謝!它會工作。不知道這很簡單。 :) – markbse

+0

我希望他們會更新文檔,因爲當你試圖讓某些東西工作時,它說requestCode的「未使用」真的很嚇人。 –

+0

小心:requestCode被定義爲int,而通常(sqlite)行ID很長。 – HaimS

2

公共布爾filterEquals(意向等)比較動作,數據,類型,包,組件和類別,但不會比較額外的內容,因此extras之間的差異無法區分Intents。嘗試爲這些意圖設置不同的數據,數據可能是微不足道的Uris。

嘗試閱讀源代碼獲取更多信息。

1

嘗試在意圖中放置一個虛擬動作。例如,

myIntent.setAction(""+System.currentTimeMillis()); 

這將導致filterEquals返回false。

我需要一個類似的解決方案來發送來自多個號碼的短消息通知, 爲了允許通知以不同的數字啓動短信線程查看器。

+0

做這個甚至工作? –

0

將任務ID和時間戳放入意圖的操作中。這樣,您將待處理意圖與任務ID相關聯,並且意向在過濾方面仍將有所不同。

intent.setAction("ACTION_" + taskId + "_" + currentTimestamp); 
0

在我來說,我沒有產生的待處理的意圖的唯一密鑰的好方法所以我所做的就是自定義的數據添加到生成的意圖。

一旦你開始填充數據屬性,你必須記得添加一個數據參數到Android清單中的意圖過濾器。如果你不這樣做,那麼不會觸發你的自定義接收器。

例子:

意圖

Intent intent = new Intent(reminderFire); 
intent.addCategory(reminderCategory); 
Uri.Builder builder = new Uri.Builder(); 
builder.scheme(context.getString(R.string.scheme)); 
builder.authority(context.getString(R.string.intent_filter_reminder_host)); 
builder.appendQueryParameter("oid", Reminder.getOid()); 
intent.setData(builder.build()); 

AndroidManifest進入

<receiver 
    android:name=".client.MyReminder" 
    android:enabled="true" 
> 
    <intent-filter> 
     <action android:name="com.example.client.reminder.fire"/> 
     <action android:name="com.example.client.reminder.category"/> 
     <data 
      android:host="@string/intent_filter_reminder_host" 
      android:scheme="@string/scheme" /> 
    </intent-filter> 
</receiver> 

通過這樣做,你也可以測試在意向獨特性前將其添加爲待的意圖,這是有用的如果你是單元測試。