2011-02-10 188 views
21

我有BroadcastReceiver一次性使用。在onReceive中取消註冊Android廣播接收器會引發「Receiver not registered」

我正在註冊一個活動。我不能將unregisterReceiver()放在中,因爲即使活動暫停或銷燬,它也必須保持運行狀態。

我想要的廣播接收器註銷本身當它完成,像這樣:

public class SmsReceiver extends BroadcastReceiver { 

    public void onReceive(Context context, Intent intent) { 
      // do some code.. 
      context.unregisterReceiver(this) 
     } 
} 

但它會導致一個例外:Receiver not registered.

回答

24

A BroadcastReceiver只有在執行其onReceive()方法時才存在。因此,這個在每次廣播被觸發/接收時評估爲一次拋棄實例。請參閱Broadcast Receiver Lifecycle。要動態註冊/取消註冊BroadcastReceiver s,您必須記住onPause()中的接收器實例,以在onResume()期間再次註冊。

+0

BroadcastReceiver對象遵循與任何其他對象相同的垃圾收集規則。沒有特殊的「拋棄實例」。在`onReceive`中引用`this`給出了與創建對象時相同的結果(嘗試它)。文檔正在討論接收者的*進程*被殺死,而不是接收者對象級別的任何事情。 – blahdiblah 2017-01-10 00:06:35

0

你試過從服務/活動註銷reciver?如果你從接收者那裏取消註冊,可能會有一些問題。

0

也許你已經在你的程序的其他地方取消了註冊,但是聽起來不太可能。也許在context.unregisterReceiver之前的某個地方,但是在onReceive方法中,您調用了一個動作,導致在到達context.unregisterReceiver之前取消接收接收器。

只要確保您從儘可能少的位置取消註冊接收器,最好 - 確切的一個。

+2

但如果我註銷它已經,爲什麼它仍然到達那點並運行註銷方法?這是不可能的... – shaimagz 2011-02-10 15:09:40

0

也許問題在於您試圖從接收方的上下文中取消註冊接收方,而不是最初註冊的上下文。

3

只需在您註冊的活動中添加一個方法調用,然後在方法中取消註冊接收方。這樣你知道它的工作已經完成。

但是,如果活動暫停或銷燬,接收器將無法工作。您必須在清單中聲明它,或者將其註冊到長時間運行的服務中,以使其在活動的整個生命週期內都能正常工作。據我所知,你不能取消註冊清單中聲明的​​接收者,因爲你沒有得到它註冊的實例。但方法調用服務註銷它應該工作。

如果您只需要一次性使用的工作人員,請使用您正在廣播的操作在清單中聲明導出的IntentService。 IntentService將在收到意圖並被賦予啓動它的意圖時啓動,然後當它完成它的工作時,它將自行停止。

10

我知道這個問題已經有了一個答案,但試試這個代碼

該代碼可用於BatteryInfo。它確實奏效。

private BroadcastReceiver mBatInfoReceiver = new BroadcastReceiver() { 
    @Override 
    public void onReceive(Context arg0, Intent intent) { 
     // TODO Auto-generated method stub 
     int level = intent.getIntExtra("level", 0); 
     Log.i("Battery", String.valueOf(level) + "%"); 
     arg0.unregisterReceiver(mBatInfoReceiver); 
    } 

}; 

//Below code is the Code which attaches the reciever put this code in which ever place you want. 

this.registerReceiver(this.mBatInfoReceiver, new IntentFilter(
       Intent.ACTION_BATTERY_CHANGED)); 

參考用於連接StackOverFlow/Tutorial

+0

這不適合我,它說它沒有註冊。我認爲原始mBatInfoReceiver不存在的時間onReceive被稱爲 – hyena 2015-10-07 09:26:05

2

我遇到了同樣的問題,其實,正確的答案是LocalBroadcastManager.getInstance(context).unregisterReceiver(this);但不context.unregisterReceiver(this)

+0

你錯過了什麼在你的答案? 「但不是`在這裏輸入代碼'」。請修復它 – 2013-11-07 18:44:27

相關問題