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