2012-06-07 58 views
28

我被卡住了。當我的應用程序啓動時,我想檢查一下我之前設置的警報是否有效。如果沒有,那麼我想設置它。有什麼方法可以檢查警報是否已設置?

我提到this solution。我試圖匹配這樣的意圖:

Intent intent = new Intent(); 
     intent.setAction("com.vit.upload"); 
     PendingIntent pIntent = PendingIntent.getBroadcast(context, 0, intent, PendingIntent.FLAG_NO_CREATE); 

但它不起作用。還有什麼可行的?

回答

65

首先,關於如何訪問以前創建的報警一個小教程:

您可以通過唯一的ID,如創建每個警報區分:

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getActivity(this,UNIQUE_ID_GOES_HERE, intent, 0); 
AlarmManager am = (AlarmManager)getSystemService(Activity.ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

當你想訪問這個警報,你必須使用相同的唯一ID創建相同的PendingIntent。例如,以下內容只會訪問您使用PendingIntent id 1234創建的警報。然後,它將取消前一個並重置它。

Intent intent = new Intent(this, AlarmReceiverActivity.class); 
PendingIntent pi = PendingIntent.getBroadcast(this, 1234, intent, 0); 
AlarmManager am = (AlarmManager) getSystemService(ALARM_SERVICE); 
am.set(AlarmManager.RTC_WAKEUP, triggerAtMillis ,pi); 

這個想法很簡單。跟蹤該ID,然後使用它們訪問各自的警報。如果您使用相同的ID創建多個警報,則最近的警報將取消之前的警報。

即將到來的主要問題,而不是每次啓動應用程序時檢查您的鬧鐘是否處於活動狀態,只需在您的活動的onCreate()方法中重新設置即可。與我上面描述的PendingIntent相同。這樣可以節省檢查警報是否預先設置的麻煩。由於您的目標是保持警報活躍,因此每次啓動應用程序時都不會因爲覆蓋之前設置的警報而受傷。只要確保你使用相同的ID來創建你的PendingIntent。

不要忘記檢查鬧鐘的時間是否已經過去,以避免嘗試設置過去一段時間的鬧鐘,這會立即觸發鬧鐘。

讓我們考慮另一種情況:當您關閉設備時,所有鬧鐘都將被取消。這讓你別無選擇,只能在重新啓動時重新設置它們。要做到這一點,你將不得不使用BroadcastReceiver

This answer將幫助你如何做到這一點。如上所述,只需在BroadcastReceiver的onReceive()方法中重新創建鬧鐘即可。

+0

嗨感謝工作場所......但是,如果我沒有活動的情況下會是什麼..然後我的啓動完成廣播接收機不會在這種情況下工作(情況與Android版本3.0以上)...所以如何拿出它..因爲我正在這樣一個應用程序,他們不想要任何活動...所以如何註冊該接收器.. – NullPointerException

+0

您只需使用標籤。看看這個:http://developer.android.com/guide/topics/manifest/receiver-element.html。如果您使用服務創建鬧鐘,則需要將上面的活動名稱更改爲您的服務類名稱。 – Erol

+0

好吧!這一個是我得到的最好的答案,所以我獎勵它! – NullPointerException

5
  • 當您重新啓動您的Android設備時,第一個鬧鐘不起作用。
  • 您可以使用布爾共享首選項來檢查是否創建警報。
  • 的Android未決意圖使用唯一ID

    INT REQUEST_CODE = 2344; //唯一ID
    的PendingIntent pIntent = PendingIntent.getBroadcast(上下文, REQUEST_CODE,意圖,PendingIntent.FLAG_NO_CREATE);

,你必須使用Boot接收廣播時,系統重新啓動,然後創建再次從我的experiance相同請求代碼REQUEST_CODE=2344;

+0

嘿,這看起來像不錯的建議,但基本問題仍然是一樣的。如何檢查它的天氣已經設置或不?和如果有程序來檢查它,那麼我應該在哪裏寫代碼?我的意思是當我的應用程序啓動或在任何其他活動?請幫助我.. – NullPointerException

3

Basiclly alaram如果你使用相同的意圖和FLAG_UPDATE_CURRENT,你可以肯定的是你不會有同樣的意圖設置兩個鬧鐘。您還可以仔細查看FLAG_NO_CREATE,它與get函數一起使用,如果pendingintent和描述的意圖已經存在,則返回null。

還記得使用相同的請求ID爲待決意圖,因爲它們是可區分的。

+0

Szczygiel非常真實的我的經驗也說,當使用相同的意圖和使用setInexactRepeating,FLAG_UPDATE_CURRENT工作... –

1

根據信息here,似乎沒有電話可以直接檢查是否存在警報,但它們確實提供了一些解決方法。

相關問題