web-dev-qa-db-ja.com

登録解除Android onReceiveのブロードキャストレシーバーが「レシーバーが登録されていません」をスローする

BroadcastReceiverを1回だけ使用できます。

アクティビティに登録しています。 unregisterReceiver()onPauseに入れることはできません。アクティビティが一時停止または破棄された場合でも、実行を継続する必要があるためです。

BroadcastReceiverが完了したら、自分自身の登録を解除してください。次のようになります。

public class SmsReceiver extends BroadcastReceiver {

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

しかし、それは例外を引き起こします:Receiver not registered.

24
shaimagz

BroadcastReceiverは、そのonReceive()メソッドの実行中にのみ存在します。したがって、thisは、ブロードキャストが起動/受信されるたびにスローアウェイインスタンスに評価されます。 Broadcast Receiver Lifecycle を参照してください。 BroadcastReceiversを動的に登録/登録解除するには、onPause()でレシーバーのインスタンスを覚えて、onResume()中に再度登録する必要があります。

25
tichy

私はこの質問にすでに答えがあることを知っていますが、このコードを試してください

このコードは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

10
MDMalik

登録したアクティビティにメソッド呼び出しを追加し、thatメソッドでレシーバーの登録を解除します。そうすればあなたは知っているその仕事は完了しました。

ただし、アクティビティが一時停止または破棄された場合、レシーバーは機能しません。マニフェストで宣言するか、長期実行サービスに登録して、アクティビティの有効期間外でも機能させる必要があります。私が知る限り、マニフェストで宣言されているレシーバーは、登録されているインスタンスを取得できないため、登録を解除できません。ただし、登録を解除するためのサービスへのメソッド呼び出しは機能するはずです。

ワーカーを1回だけ使用する必要がある場合は、エクスポートするIntentServiceを、ブロードキャストするアクションを含むマニフェストで宣言します。そのIntentServiceは、インテントが受信され、それを開始したインテントが与えられると開始され、ジョブが完了すると、自動的に停止します。

3
Austin B

私は同じ問題に遭遇しました、実際、正しい答えはLocalBroadcastManager.getInstance(context).unregisterReceiver(this);ですがcontext.unregisterReceiver(this)ではありません

2
user2966072

おそらく、プログラムの他の場所ですでに登録を解除していますが、これは聞こえないかもしれません。 context.unregisterReceiverの前のどこかにあるかもしれませんが、onReceiveメソッドでアクションを呼び出すと、context.unregisterReceiverに到達する前にレシーバーの再登録が解除されます。

できるだけ少ない場所、好ましくは1つだけからレシーバーの登録を解除していることを確認してください。

0
George

多分問題は、最初に登録されたコンテキストではなく、レシーバのコンテキストからレシーバを登録解除しようとしていることです。

0
hvuoltee

サービス/アクティビティからレシーバーの登録を解除しようとしましたか?自分自身を登録解除するために受信者からそれを呼び出す場合、おそらくいくつかの問題があります。

0
mdelolmo