2013-07-24 29 views
2

目前,我有一個廣播接收器將在網絡活動發生變化時執行。1廣播接收機實例在任何給定的時間

<receiver android:name="org.yccheok.jstock.network.ConnectivityChangeBroadcastReceiver" > 
     <intent-filter> 
      <action android:name="android.net.conn.CONNECTIVITY_CHANGE" /> 
     </intent-filter> 
    </receiver> 

但是,有時候,會有內ConnectivityChangeBroadcastReceiver長時間運行的操作。如果用戶傾向於在短時間內多次改變網絡連接性,則會產生多個廣播接收機實例。

我只希望在任何給定的時間運行1個ConnectivityChangeBroadcastReceiver。有什麼技術可以申請嗎?

+0

也許你可以創建一個Singleton類不是廣播接收器? – Geros

+1

爲什麼不將長時間運行的操作移動到服務上,讓BroadcastReceiver只執行基於文檔的快速操作? – sandrstar

回答

2

基於the documentation

的,可能需要一個過程的創建接收器,只有一個 將在時間運行避免過載系統與新 過程

所以,android:process使用將阻止兩個接收器的創建。

但是,維持Service並從brodcast接收器發送意圖可能更爲靈活。該服務將能夠對輸入的意圖進行必要的排序/拒絕處理/查詢。

-1

您可以在ConnectivityChangeBroadcastReceiver中只使用一個靜態布爾字段來跟蹤該方法當前是否正在執行。

public class ConnectivityChangeBroadcastReceiver extends BroadcastReceiver { 
    private static boolean currentlyReceiving = false; 

@Override 
public void onReceive(Context context, Intent intent) { 
    if(!currentlyReceiving) { 
     currentlyReceiving = true; 
     doYourLongTaskHere(); 
     currentlyReceiving = false; 
    } 
    } 
} 

我不知道如果每個廣播將在不同的線程或無法運行,所以你可能要if語句中扔塊爲synchronized塊。

1

您不應該在BroadcastReceiver內部執行長時間運行的任務。相反,啓動一個服務做長時間運行的任務描述here.

0

使用標誌,並超越它當廣播接收器被稱爲並降低IT工作的時候了,這樣沒有新的實例可以調用廣播接收機