2012-10-13 73 views
3

之後再調用一次以上我正在構建一個鬧鐘應用程序。當警報開始意圖時,接收器開始發生「魔術」的地方。不知何故,廣播接收器內的onReceive()方法多被調用一次。意圖調用

任何想法,爲什麼這是怎麼回事?

編輯:

這就是所謂的,曾多次只有當屏幕關閉時,如果屏幕打開時它不會發生。當屏幕關閉時,我將此代碼打開:

KeyguardManager km = (KeyguardManager) getSystemService(Context.KEYGUARD_SERVICE); 
KeyguardManager.KeyguardLock kl = km.newKeyguardLock("MyKeyguardLock"); 
kl.disableKeyguard(); 

WakeLock wakeLock = pm.newWakeLock(PowerManager.FULL_WAKE_LOCK | 
            PowerManager.ACQUIRE_CAUSES_WAKEUP | 
            PowerManager.ON_AFTER_RELEASE, "MyWakeLock"); 
wakeLock.acquire(); 

我在做什麼錯?在AndroidManifest.xml我註冊使用此代碼廣播reciever:

<receiver android:name="com.xxx.xxx.myAlarmReceiver" > 
    <intent-filter> 
      <action android:name="REFRESH_THIS" /> 
    </intent-filter> 
</receiver> 

我不知道有關REFRESH_THIS。但是,如果我改變它,接收器仍然被調用一次以上。

回答

0

我最近調試了一個具有相同行爲的應用程序。當設備開啓時,處理意圖的服務被放棄,但它仍然會積累消息。

一些潛在的問題,你可能看出來

  • 如果你使用報警作爲間隔定時器(通過 setRepeating(),或一些不太美好的串行方法)定時器 可以去當[應用程序/服務]不是 正在運行時(即設備關閉時 - see the doc)關閉幾次。結果 是幾個消息在處理程序中排隊,並且當 應用程序返回到前臺時,處理程序將通過隊列運行 - 將消耗多個警報意圖。

  • 您使用擴展Service接收意圖的一類,並 你START_REDELIVER_INTENT開始爲您服務。當 服務在後臺執行中間任務時:它已成功部分執行 並被中斷以暫停。當重新啓動 意圖重新交付和第二次處理。

  • recycle()您的消息 - 或只是擴展IntentService

要調試你可能要

  • 添加一個遞增的額外給每個意向(通過addExtra(String, int)),查看是否有意向被傳遞多次,幾個意圖是被同時消耗。

您還應該在問題中包含接收者的代碼。

就是這些。