3

に動的に登録さBroadcastReceiverれていServiceます。となりAudioManager.RINGER_MODE_CHANGED_ACTIONますIntentFilter。サービスを開始するたびに、onReceive()メソッドでログ メッセージを取得します。その後は正常に動作します。いちいちサービス開始時に一度受信したくありません。ここで何が欠けているのか教えてください。

    receiver=new BroadcastReceiver(){
        @Override
        public void onReceive(Context context, Intent intent) {
             Log.d("zil", "degisti");

        }
    };
    IntentFilter filter=new IntentFilter(
                    AudioManager.RINGER_MODE_CHANGED_ACTION);
    registerReceiver(receiver,filter);
4

2 に答える 2

5

あなたが興味を持っている意図はAudioManager.RINGER_MODE_CHANGED_ACTION、「粘着性」です。つまり、システムは常に最後に送信されたブロードキャストを保持しBroadcastReceiver、そのインテントに関心のあるが登録されると、すぐにそれを受信します。これは非常に便利な機能ですが、必要な機能ではない場合もあります;-)

あなたは実際の「変化」イベントにのみ興味があると思います。この場合、「現在の」イベントを無視し、将来発生するイベントのみをリッスンする必要があります。あなたにとって幸運なことに、解決策があります:

'onReceive()'で、次のようにします。

if (isInitialStickyBroadcast()) {
    // Ignore this one as we aren't interested in the current state
} else {
    Log.d("zil", "degisti");
    // Do whatever you want to do with the event here
}
于 2012-07-11T15:38:09.173 に答える
0
unregisterReceiver(receiver);

BroadcastReciever の Anonymous 内部クラス実装を作成したため、これはおそらく機能しません。代わりに、サービスを開始するアクティビティで BroacastReceiver を拡張するネストされた/プライベート クラスを作成します。次に、Activity ライフサイクル コールバックでレシーバーを動的に登録および登録解除します。

于 2012-07-11T15:03:45.827 に答える