Android 广播接收器类和registerReceiver方法

Android 广播接收器类和registerReceiver方法,android,android-broadcast,Android,Android Broadcast,您好,我正在努力理解广播接收机,我通过了许多示例代码,但仍然有一些疑问。我想知道什么时候我们必须扩展Broadcast Receiver类,什么时候应该使用registerReceiver()方法,什么时候应该为BroadcastReceiver创建对象。在一些程序中,我遇到了使用的registerReceiver方法,但没有扩展广播接收器类。我还想知道如何调用onReceive方法 什么时候应该使用哪种方法 以下是注册表接收程序的方法: registerReceiver(new Broadca

您好,我正在努力理解广播接收机,我通过了许多示例代码,但仍然有一些疑问。我想知道什么时候我们必须扩展Broadcast Receiver类,什么时候应该使用
registerReceiver()
方法,什么时候应该为BroadcastReceiver创建对象。在一些程序中,我遇到了使用的
registerReceiver
方法,但没有扩展广播接收器类。我还想知道如何调用
onReceive
方法

什么时候应该使用哪种方法

以下是注册表接收程序的方法:

registerReceiver(new BroadcastReceiver() {

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

            }

        }, new IntentFilter(SENT));
广播接收器创建的对象

private BroadcastReceiver intentReceiver = new BroadcastReceiver() {

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

};

在这两种情况下,
BroadcastReceiver
都将被扩展。在第二个示例中,您创建了所谓的匿名类。新类没有特定的名称,这就是为什么它被称为。无论如何,这个新类扩展了
BroadcastReceiver
并重写了
onReceive()
方法

现在回到你的问题上来。有两种接收机-静态和动态定义的接收机

如果在AndroidManifest文件中声明接收方,那么它是静态定义的。在这种情况下,您需要通过名称引用实现BroadcastReceiver的类。如您所见,您不能使用匿名类,因为最后一个类没有名称。您必须显式地实现一个接收器。值得一提的是,在这种情况下,您不使用
registerReceiver()
方法。Android会自动为你做这件事

如果动态声明接收者(例如在活动的
onResume()
方法中),则可以为此使用匿名类。要注册接收器,请调用
registerReceiver()
方法。您也可以使用命名类。在这种情况下,两个选项都有效


希望这能解释区别。

在这两种情况下,您都是在创建对象。但在第一种情况下,没有任何参考 接收器对象,以便以后无法注销,但第二个对象已注销,以便可以注销 使用以下方法注册对象后注销:

registerReceiver(intentReceiver );
unregisterReceiver(intentReceiver );
Android已经为广播接收机提供了一个新的接口。当它侦听在其中注册的任何操作时将被触发

现在我们举一个例子: 我们需要倾听“任何蓝牙设备连接到我们的设备时”的动作。为此,安卓系统安装了固定操作
android.bluetooth.BluetoothDevice.action\u ACL\u CONNECTED

因此,您也可以通过清单和注册获得它

舱单登记:

把这个放在你的舱单上

<receiver android:name="MyBTReceiver">
    <intent-filter>
                <action android:name="android.bluetooth.BluetoothDevice.ACTION_ACL_CONNECTED" />
      </intent-filter>
</receiver>
那是最简单的广播接收器

现在,, 如果您只想在运行时接收广播,最好使用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);
    }
}

有必要注册接收人吗?是的,在第一种广播中,你必须在舱单中注册,在第二种广播中,你必须在你的类中注册。但是在第二种情况下,不要忘记取消注册。在第二种广播中(我不扩展广播接收器),我也可以在同一个类中注册两个不同的接收器吗?是的,但是你可以在一个接收器的意图过滤器中添加多个操作。因此,你不需要在同一个类中创建多个接收器。只需在一个接收器中添加这些操作即可。
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);
    }
}