17

嗨,我正在尝试了解广播接收器,我经历了许多示例代码,但仍有一些疑问。我想知道我们什么时候必须扩展广播接收器类,什么时候应该使用registerReceiver()方法,什么时候应该为广播接收器创建对象。在某些程序中,我遇到了registerReceiver正在使用但没有扩展广播接收器类的方法。我还想知道如何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 具有 广播接收器的意图操作广播接收器将在侦听其中注册的任何操作时触发。

现在我们举一个例子:我们需要监听“每当任何蓝牙设备连接到我们的设备时”的动作。对于那个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()。您也可以在现有的类文件中注册它。您还需要注销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都会延长。在您的第二个示例中,您创建了所谓的匿名类。新类没有特定的名称,这就是它如此命名的原因。无论如何,这个新类扩展BroadcastReceiver并覆盖了onReceive()方法。

现在回到你的问题。有两种接收器——静态和动态定义的。

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

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

希望这能解释差异。

于 2013-09-17T06:23:46.983 回答
1

在这两种情况下,您都在创建对象。但在第一种情况下,接收者对象没有任何引用,因此以后不能取消注册,但第二种情况下,可以在使用以下方法注册对象后取消注册:

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