在配对或连接蓝牙扫描仪(Inateck)和移动设备时,activity 被破坏
On pairing or connecting a Bluetooth Scanner(Inateck) and a mobile device the activity gets destroyed
我正在设置蓝牙扫描仪 Android 应用程序,我正在尝试使用 android 代码连接蓝牙扫描仪 (Inateck) 和移动设备。
我的要求:
通过我的应用程序配对这两个设备。
与设备连接。
蓝牙扫描仪将从条形码中扫描代码,我需要将其显示在
我的应用程序编辑文本。
首先,我将发现使用 Android 蓝牙 API 的蓝牙设备。
public final BroadcastReceiver AvailableBlueToothDevicesBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG, "onReceive: ACTION FOUND.");
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (availableDevice == null) {
availableDevice = new MutableLiveData<BluetoothDevice>();
}
availableDevice.setValue(device);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//Done searching
if (availableDevice == null) {
availableDevice = new MutableLiveData<BluetoothDevice>();
}
availableDevice.setValue(null);
}
}
};
这是获取可用设备的广播接收器。
我会注册这个
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
getContext().registerReceiver(broadcastManager.AvailableBlueToothDevicesBroadcastReceiver, discoverDevicesIntent);
有了这个,我将获得附近的蓝牙设备列表。我会在 Recyclerview 中列出它。单击这些设备中的任何一个时,必须执行设备之间的配对。
为此,我使用了以下代码。
private void pairDevice(BluetoothDevice bluetoothDevice){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
Log.d(TAG, "Trying to pair with " +
bluetoothDevicebluetoothDevice.getName());
bluetoothDevice.createBond();
}
}
执行此代码后,会出现一个对话框,要求与设备配对。一旦配对完成,我的 Activity 的 onDestroy() 生命周期事件就会被调用,我的 activity 会默认重新创建。这会丢失我之前在 activity 中的数据。这不应该发生。但是配对成功。
当我尝试连接我的 Android 手机 phone 和蓝牙扫描仪设备时会发生这种情况。但是,如果我尝试在两个 android phone 之间配对,则不会调用 onDestroy() 事件。
谁能告诉我为什么会这样?
某些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性,以及当用户启用多 window 模式时)。发生此类更改时,Android 将重新启动 运行 Activity(调用 onDestroy(),然后调用 onCreate())。重新启动行为旨在通过使用与新设备配置匹配的替代资源自动重新加载您的应用程序来帮助您的应用程序适应新配置。
在我的例子中,我试图连接到一个蓝牙扫描仪,它将充当一个物理键盘。
所以我们需要在AndroidManifest.xml
中添加activity中的configChanges
android:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation"
但是方向和屏幕尺寸在配置更改中不是必须的。但其他人是。
更多请参考:
https://developer.android.com/guide/topics/resources/runtime-changes
我正在设置蓝牙扫描仪 Android 应用程序,我正在尝试使用 android 代码连接蓝牙扫描仪 (Inateck) 和移动设备。
我的要求: 通过我的应用程序配对这两个设备。 与设备连接。 蓝牙扫描仪将从条形码中扫描代码,我需要将其显示在 我的应用程序编辑文本。
首先,我将发现使用 Android 蓝牙 API 的蓝牙设备。
public final BroadcastReceiver AvailableBlueToothDevicesBroadcastReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
final String action = intent.getAction();
Log.d(TAG, "onReceive: ACTION FOUND.");
if (action.equals(BluetoothDevice.ACTION_FOUND)) {
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
if (availableDevice == null) {
availableDevice = new MutableLiveData<BluetoothDevice>();
}
availableDevice.setValue(device);
} else if (BluetoothAdapter.ACTION_DISCOVERY_FINISHED.equals(action)) {
//Done searching
if (availableDevice == null) {
availableDevice = new MutableLiveData<BluetoothDevice>();
}
availableDevice.setValue(null);
}
}
};
这是获取可用设备的广播接收器。
我会注册这个
IntentFilter discoverDevicesIntent = new IntentFilter(BluetoothDevice.ACTION_FOUND);
getContext().registerReceiver(broadcastManager.AvailableBlueToothDevicesBroadcastReceiver, discoverDevicesIntent);
有了这个,我将获得附近的蓝牙设备列表。我会在 Recyclerview 中列出它。单击这些设备中的任何一个时,必须执行设备之间的配对。 为此,我使用了以下代码。
private void pairDevice(BluetoothDevice bluetoothDevice){
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.JELLY_BEAN_MR2) {
Log.d(TAG, "Trying to pair with " +
bluetoothDevicebluetoothDevice.getName());
bluetoothDevice.createBond();
}
}
执行此代码后,会出现一个对话框,要求与设备配对。一旦配对完成,我的 Activity 的 onDestroy() 生命周期事件就会被调用,我的 activity 会默认重新创建。这会丢失我之前在 activity 中的数据。这不应该发生。但是配对成功。
当我尝试连接我的 Android 手机 phone 和蓝牙扫描仪设备时会发生这种情况。但是,如果我尝试在两个 android phone 之间配对,则不会调用 onDestroy() 事件。 谁能告诉我为什么会这样?
某些设备配置可能会在运行时发生变化(例如屏幕方向、键盘可用性,以及当用户启用多 window 模式时)。发生此类更改时,Android 将重新启动 运行 Activity(调用 onDestroy(),然后调用 onCreate())。重新启动行为旨在通过使用与新设备配置匹配的替代资源自动重新加载您的应用程序来帮助您的应用程序适应新配置。
在我的例子中,我试图连接到一个蓝牙扫描仪,它将充当一个物理键盘。 所以我们需要在AndroidManifest.xml
中添加activity中的configChangesandroid:configChanges="orientation|screenSize|keyboard|keyboardHidden|navigation"
但是方向和屏幕尺寸在配置更改中不是必须的。但其他人是。
更多请参考: https://developer.android.com/guide/topics/resources/runtime-changes