2012-03-15 103 views
0

我最初通過代碼在我的主要活動中註冊了我的廣播接收器。但是,我有IntentServices(在後臺運行)廣播意圖,因此需要廣播接收器始終可用。我的代碼註冊接收器的方法工作正常,直到後退按鈕被按下。然後,接收人將被註銷,因爲主要活動將被破壞。奇怪的廣播接收器行爲

因此,我的想法是將接收器的聲明移到Manifest文件。但是,我遇到了一個奇怪的問題,每次我的代碼廣播一個意圖時,都會創建一個廣播接收器的新實例。我想要的是,廣播接收器的一個實例始終可用。這是因爲我的廣播接收機創建並啓動了一個定時器,但是如果創建了多個接收機實例,那麼將創建多個定時器,這是不好的。

注意:我的廣播接收器的單個實例可以處理收到意圖但計時器已經啓動的情況。

這是我在清單文件代碼:

<receiver android:name=".StartTimerBroadcastReceiver" android:enabled="true" > 
     <intent-filter> 
      <action android:name="START_TIMER" /> 
     </intent-filter> 
</receiver> 

這裏是我的代碼,廣播意圖:

Intent broadcastIntent = new Intent("START_TIMER"); 
broadcastIntent.putExtra("timerID", "timer1"); 
sendBroadcast(broadcastIntent); 

難道我做錯了什麼?任何幫助表示讚賞。謝謝

回答

1

無法通過清單獲得BroadcastReceiver的一個實例。

你可以做的是爲你的定時器創建一個靜態變量。

如果這不是您的問題的解決方案,那麼創建一個服務,當收到一個廣播時,用一些額外的Intent啓動服務,指定如何開始時間(即將廣播重定向到您的服務)。

+0

感謝您的支持。我會研究這2個選項。在我的情況下,有一些靜態方法的定時器處理程序類可能是可以接受的,因爲我希望能夠儘可能簡單地在整個應用程序中使用單個定時器。我首先使用intent廣播的基本原理是,我不必將定時器對象深入到代碼中。然而,我認爲一個正確實現的定時器處理程序,允許其他對象通過靜態方法啓動定時器將是好的:) – jtnire 2012-03-15 05:17:55

1

這是BroadcastReceivers的工作方式。檢查出http://developer.android.com/reference/android/content/BroadcastReceiver.html,特別是標題爲「接收器生命週期」的部分:

「BroadcastReceiver對象僅在調用onReceive(Context,Intent)期間有效。一旦代碼從此函數返回,系統會認爲該對象

這對你在onReceive(Context,Intent)實現中可以做什麼有重要影響:任何需要異步操作的東西都不可用,因爲你需要從函數返回到處理異步操作,但此時BroadcastReceiver不再處於活動狀態,因此係統可以在異步操作完成之前自由地終止其進程。「

從我所看到的情況來看,這在清單中註冊BroadcastReceiver時看起來更糟糕。