登録解除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.
BroadcastReceiver
は、そのonReceive()
メソッドの実行中にのみ存在します。したがって、thisは、ブロードキャストが起動/受信されるたびにスローアウェイインスタンスに評価されます。 Broadcast Receiver Lifecycle を参照してください。 BroadcastReceiver
sを動的に登録/登録解除するには、onPause()
でレシーバーのインスタンスを覚えて、onResume()
中に再度登録する必要があります。
私はこの質問にすでに答えがあることを知っていますが、このコードを試してください
このコードは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
登録したアクティビティにメソッド呼び出しを追加し、thatメソッドでレシーバーの登録を解除します。そうすればあなたは知っているその仕事は完了しました。
ただし、アクティビティが一時停止または破棄された場合、レシーバーは機能しません。マニフェストで宣言するか、長期実行サービスに登録して、アクティビティの有効期間外でも機能させる必要があります。私が知る限り、マニフェストで宣言されているレシーバーは、登録されているインスタンスを取得できないため、登録を解除できません。ただし、登録を解除するためのサービスへのメソッド呼び出しは機能するはずです。
ワーカーを1回だけ使用する必要がある場合は、エクスポートするIntentServiceを、ブロードキャストするアクションを含むマニフェストで宣言します。そのIntentServiceは、インテントが受信され、それを開始したインテントが与えられると開始され、ジョブが完了すると、自動的に停止します。
私は同じ問題に遭遇しました、実際、正しい答えはLocalBroadcastManager.getInstance(context).unregisterReceiver(this);
ですがcontext.unregisterReceiver(this)
ではありません
おそらく、プログラムの他の場所ですでに登録を解除していますが、これは聞こえないかもしれません。 context.unregisterReceiver
の前のどこかにあるかもしれませんが、onReceive
メソッドでアクションを呼び出すと、context.unregisterReceiver
に到達する前にレシーバーの再登録が解除されます。
できるだけ少ない場所、好ましくは1つだけからレシーバーの登録を解除していることを確認してください。
多分問題は、最初に登録されたコンテキストではなく、レシーバのコンテキストからレシーバを登録解除しようとしていることです。
サービス/アクティビティからレシーバーの登録を解除しようとしましたか?自分自身を登録解除するために受信者からそれを呼び出す場合、おそらくいくつかの問題があります。