web-dev-qa-db-ja.com

ブロードキャストレシーバークラスとregisterReceiverメソッド

こんにちは、私はBroadcast Receiverを理解しようとしています。多くのサンプルコードを試しましたが、まだ疑問があります。 Broadcast Receiverクラスを拡張する必要があるとき、registerReceiver()メソッドをいつ使用する必要があるのか​​、BroadcastReceiverのオブジェクトをいつ作成するのかを知りたいと思いました。一部のプログラムでは、registerReceiverメソッドが使用されていますが、Broadcast Receiverクラスを拡張していません。また、onReceiveメソッドがどのように呼び出されるかを知りたいと思いました。

どのアプローチを使用すべきか?

registerReceiverメソッドは次のとおりです。

registerReceiver(new BroadcastReceiver() {

            @Override
            public void onReceive(Context context, Intent intent) {
                switch (getResultCode()) {
                ........
                }

            }

        }, new IntentFilter(SENT));

BroadcastReceiver用に作成されるオブジェクト:

private BroadcastReceiver intentReceiver = new BroadcastReceiver() {

    @Override
    public void onReceive(Context context, Intent intent) {
        .................
    }

};
13
user2717079

Androidには、ブロードキャストレシーバー用の インテントアクション があります。 BroadCast receiver は、その中に登録されたアクションをリッスンするときにトリガーされます。

ここで1つの例を取り上げます。「Bluetoothデバイスがデバイスに接続するたびに」アクションをリッスンする必要があるということです。そのためAndroid修正アクションがあります_Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED_

マニフェストと登録でも取得できます

マニフェスト登録:

これをマニフェストに入れてください

_<receiver Android:name="MyBTReceiver">
    <intent-filter>
                <action Android:name="Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED" />
      </intent-filter>
</receiver>
_

_MyBTReceiver.class_を作成

_public class MyBTReceiver extends BroadcastReceiver {

    @Override
    public void onReceive(Context context, Intent intent) {

        if(intent.getAction().equals("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")){
            Log.d(TAG,"Bluetooth connect");
        }
    }
}
_

それは最も単純な放送受信機でした。

現在、実行中にブロードキャストの受信にのみ関心がある場合は、registerReceiver()を使用することをお勧めします。また、既存のクラスファイル内で register にすることもできます。 登録解除 it onDestroy()も必要です。ここでは、アクティビティ登録を除くマニフェストのブロードキャスト登録は必要ありません

例えば

_public class MainActivity extends Activity {

    IntentFilter filter1;

    @Override
    public void onCreate() {
        filter1 = new IntentFilter("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED");
        registerReceiver(myReceiver, filter1);
    }

    //The BroadcastReceiver that listens for bluetooth broadcasts
    private final BroadcastReceiver myReceiver = new BroadcastReceiver() {
        @Override
        public void onReceive(Context context, Intent intent) {
            if(intent.getAction().equalsIgnoreCase("Android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED")) {
                Log.d(TAG,"Bluetooth connect");
            }
        }
    };

    @Override
    public void onDestroy() {
        unregisterReceiver(myReceiver);
    }
}
_
42

どちらの場合も、BroadcastReceiverは拡張されます。 2番目の例では、いわゆる匿名クラスを作成します。新しいクラスには特定の名前がないため、そう呼ばれています。とにかく、この新しいクラスはBroadcastReceiverを拡張し、onReceive()メソッドをオーバーライドします。

質問に戻りましょう。レシーバには、静的に定義されたものと動的に定義されたものの2種類があります。

AndroidManifestファイルでレシーバーを宣言すると、静的に定義されます。この場合、BroadcastReceiverを実装するクラスを名前で参照する必要があります。ご覧のとおり、最後のクラスには名前がないため、匿名クラスは使用できません。レシーバーを明示的に実装する必要があります。この場合、使用しないregisterReceiver()メソッドであることに注意してください。 Androidは自動的にそれを行います。

レシーバーを動的に宣言する場合(たとえば、アクティビティのonResume()メソッドで)、匿名クラスを使用できます。レシーバーを登録するには、registerReceiver()メソッドを呼び出します。名前付きクラスも使用できます。この場合、両方のオプションが有効です。

これが違いを説明することを願っています。

2

どちらの場合もオブジェクトを作成していますが、最初の場合はレシーバーオブジェクトへの参照がないため後で登録を解除できませんが、2番目の場合は以下を使用してオブジェクトを登録した後に登録を解除できますmethods

registerReceiver(intentReceiver );
unregisterReceiver(intentReceiver );
1
nilamber