17

こんにちは、Broadcast Receiver を理解しようとしています。多くのサンプル コードを試しましたが、まだ疑問があります。registerReceiver()Broadcast Receiver クラスをいつ拡張する必要があるか、いつメソッドを使用する必要があるか、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) {
        .................
    }

};
4

3 に答える 3

46

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

ここで、1 つの例を取り上げます。「Bluetooth デバイスがデバイスに接続するたびに」アクションをリッスンする必要があるということです。そのアンドロイドには修正アクションがあります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() を使用することをお勧めします。既存のクラス ファイル内に登録することもできます。また、登録を解除する必要があります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);
    }
}
于 2013-09-17T06:35:46.607 に答える
3

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

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

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

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

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

于 2013-09-17T06:23:46.983 に答える
1

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

registerReceiver(intentReceiver );
unregisterReceiver(intentReceiver );
于 2013-09-17T06:31:48.197 に答える