处理 Android 低功耗蓝牙断开通知
Handle Android Bluetooth LE Disconnect Notification
我已经开发了一个 Android 连接到蓝牙 LE(低功耗,4.0)计步器的应用程序。一切都很好,除了我根本不处理断开连接的情况,而且我想确保我是。
我想确保如果用户关闭智能手机蓝牙或关闭蓝牙计步器设备,我可以立即收到通知。我已经想出如何做到这一点,代码如下。但是,当我检测到蓝牙断开连接时,我不确定如何从我的接收器 class 与我的 Activity(用户可能打开的任何 activity)通话。在这种情况下,我设想当前 activity 中会出现一条消息,告诉用户他们必须再次打开蓝牙才能继续。
所以,我想我的问题是如何从接收器通知我的任何一项活动(取决于用户正在进行的活动)class?
谢谢!
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<receiver android:name="com.pedometerproject" android:exported="false">
<intent-filter>
<action android:name"android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
BluetoothTest.java
public class BluetoothTest extends BroadcastReceiver {
@override
public void onReceive(Context context, Intent intent)
{
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction()))
{
if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1) == BluetoothAdapter.STATE_OFF)
{
//WORKS TO HERE. HOW DO I TELL THE CURRENT ACTIVITY THE USER IS ON THAT BLUETOOTH HAS DISCONNECTED?
}
}
您通常有两种方法...最简单的方法是在您的所有活动中注册接收器。
您可以添加实现观察者模式的自定义应用程序 class(或只是单例对象),并在每个 activity 中订阅它。 (在OnResume订阅,在onPause取消订阅)
在我的应用程序中,我更喜欢第一种方式,因为它 simplier.But 第二种方式更快,如果这对你很重要的话。
这是我的默认片段包装器代码:
public abstract class BleServiceFragment extends Fragment{
private static final int REQUEST_ENABLE_BT = 0;
private BluetoothLeService mService=null;
protected abstract BroadcastReceiver getBleReceiver();
private IntentFilter filter =makeFilter();
boolean receiverRegistered=false;
protected IntentFilter makeFilter(){
IntentFilter filter = new IntentFilter(Const.Intent.BLE_CARD_LIST);
return filter;
}
@Override
public void onStart() {
super.onStart();
final BluetoothManager bluetoothManager =
(BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// Checks if Bluetooth is supported on the device.
if (mBluetoothAdapter == null) {
Toast.makeText(getActivity(), getResources().getString(R.string.error_bluetooth_not_supported), Toast.LENGTH_SHORT).show();
getActivity().finish();
return;
}
}
@Override
public void onResume() {
super.onResume();
if(!mBluetoothAdapter.isEnabled())
{
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
getActivity().registerReceiver(getBleReceiver(), filter);
receiverRegistered=true;
}
@Override
public void onPause()
{
super.onPause();
if(receiverRegistered)
{
getActivity().unregisterReceiver(getBleReceiver());
receiverRegistered=false;
}
}
@Override
public void onStop() {
super.onStop();
if(receiverRegistered)
{
getActivity().unregisterReceiver(getBleReceiver());
receiverRegistered=false;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// User chose not to enable Bluetooth.
if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
getActivity().finish();
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
我只是从它那里继承了我所有的工作片段,实现 getBleReceiver()
并在需要时覆盖 makeFilter()
。
我已经开发了一个 Android 连接到蓝牙 LE(低功耗,4.0)计步器的应用程序。一切都很好,除了我根本不处理断开连接的情况,而且我想确保我是。
我想确保如果用户关闭智能手机蓝牙或关闭蓝牙计步器设备,我可以立即收到通知。我已经想出如何做到这一点,代码如下。但是,当我检测到蓝牙断开连接时,我不确定如何从我的接收器 class 与我的 Activity(用户可能打开的任何 activity)通话。在这种情况下,我设想当前 activity 中会出现一条消息,告诉用户他们必须再次打开蓝牙才能继续。
所以,我想我的问题是如何从接收器通知我的任何一项活动(取决于用户正在进行的活动)class?
谢谢!
AndroidManifest.xml
<uses-permission android:name="android.permission.BLUETOOTH"/>
<uses-permission android:name="android.permission.BLUETOOTH_ADMIN"/>
<receiver android:name="com.pedometerproject" android:exported="false">
<intent-filter>
<action android:name"android.bluetooth.adapter.action.STATE_CHANGED"/>
</intent-filter>
BluetoothTest.java
public class BluetoothTest extends BroadcastReceiver {
@override
public void onReceive(Context context, Intent intent)
{
if (BluetoothAdapter.ACTION_STATE_CHANGED.equals(intent.getAction()))
{
if (intent.getIntExtra(BluetoothAdapter.EXTRA_STATE,-1) == BluetoothAdapter.STATE_OFF)
{
//WORKS TO HERE. HOW DO I TELL THE CURRENT ACTIVITY THE USER IS ON THAT BLUETOOTH HAS DISCONNECTED?
}
}
您通常有两种方法...最简单的方法是在您的所有活动中注册接收器。
您可以添加实现观察者模式的自定义应用程序 class(或只是单例对象),并在每个 activity 中订阅它。 (在OnResume订阅,在onPause取消订阅)
在我的应用程序中,我更喜欢第一种方式,因为它 simplier.But 第二种方式更快,如果这对你很重要的话。
这是我的默认片段包装器代码:
public abstract class BleServiceFragment extends Fragment{
private static final int REQUEST_ENABLE_BT = 0;
private BluetoothLeService mService=null;
protected abstract BroadcastReceiver getBleReceiver();
private IntentFilter filter =makeFilter();
boolean receiverRegistered=false;
protected IntentFilter makeFilter(){
IntentFilter filter = new IntentFilter(Const.Intent.BLE_CARD_LIST);
return filter;
}
@Override
public void onStart() {
super.onStart();
final BluetoothManager bluetoothManager =
(BluetoothManager) getActivity().getSystemService(Context.BLUETOOTH_SERVICE);
mBluetoothAdapter = bluetoothManager.getAdapter();
// Checks if Bluetooth is supported on the device.
if (mBluetoothAdapter == null) {
Toast.makeText(getActivity(), getResources().getString(R.string.error_bluetooth_not_supported), Toast.LENGTH_SHORT).show();
getActivity().finish();
return;
}
}
@Override
public void onResume() {
super.onResume();
if(!mBluetoothAdapter.isEnabled())
{
Intent enableBtIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableBtIntent, REQUEST_ENABLE_BT);
}
getActivity().registerReceiver(getBleReceiver(), filter);
receiverRegistered=true;
}
@Override
public void onPause()
{
super.onPause();
if(receiverRegistered)
{
getActivity().unregisterReceiver(getBleReceiver());
receiverRegistered=false;
}
}
@Override
public void onStop() {
super.onStop();
if(receiverRegistered)
{
getActivity().unregisterReceiver(getBleReceiver());
receiverRegistered=false;
}
}
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
// User chose not to enable Bluetooth.
if (requestCode == REQUEST_ENABLE_BT && resultCode == Activity.RESULT_CANCELED) {
getActivity().finish();
return;
}
super.onActivityResult(requestCode, resultCode, data);
}
我只是从它那里继承了我所有的工作片段,实现 getBleReceiver()
并在需要时覆盖 makeFilter()
。