我正在尝试通过实现自己的Android蓝牙库来进行蓝牙聊天。我希望在图形部分和逻辑部分之间有一个清晰的分隔(为了模块化)。
为了获取蓝牙设备列表,我以编程方式在我的BluetoothManager类(库)中注册了一个新的BroadcastReceiver。
我想将这些值返回或存储在此类中的数组中,以便可以从(外部)活动/片段中访问它们。
我应该怎么做?
这是来自BluetoothManager(库)的代码:
public class BluetoothManager {
private BluetoothAdapter bluetoothAdapter;
private Context context;
public BluetoothManager(Context context) {
this.context = context;
this.bluetoothAdapter = BluetoothAdapter.getDefaultAdapter();
if (bluetoothAdapter == null) {
Log.d("[BluetoothManager]", "Error device does not support Bluetooth");
}
}
// Create a BroadcastReceiver for ACTION_FOUND.
private final BroadcastReceiver mReceiver = new BroadcastReceiver() {
public void onReceive(Context context, Intent intent) {
String action = intent.getAction();
if (BluetoothDevice.ACTION_FOUND.equals(action)) {
// Get the BluetoothDevice object and its info from the Intent.
BluetoothDevice device = intent.getParcelableExtra(BluetoothDevice.EXTRA_DEVICE);
// Add value into an array or return --> TODO
}
}
};
public void discovery(){
// Check if the device is already "discovering". If it is, then cancel discovery.
if (bluetoothAdapter.isDiscovering()) {
bluetoothAdapter.cancelDiscovery();
}
// Start Discovery
bluetoothAdapter.startDiscovery();
// Register for broadcasts when a device is discovered.
IntentFilter filter = new IntentFilter(BluetoothDevice.ACTION_FOUND);
context.getApplicationContext().registerReceiver(mReceiver, filter);
}
...
}
这是片段中的代码:
public class TabFragment extends ListFragment implements AdapterView.OnItemClickListener {
private BluetoothManager bluetoothManager;
@Override
public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) {
View fragmentView = inflater.inflate(R.layout.fragment_tab_fragment2, container, false);
Button button = fragmentView.findViewById(R.id.button2);
button.setOnClickListener(new View.OnClickListener() {
public void onClick(View v) {
bluetoothManager = new BluetoothManager(getContext());
if(bluetoothManager.activeBluetooth()){
bluetoothManager.discovery();
// Get Values here --> TODO
}
}
});
// Add return values into a list
//final String[] items = ...;
final ArrayAdapter<String> aa = new ArrayAdapter<String>(getActivity(),
android.R.layout.simple_list_item_1, items);
setListAdapter(aa);
return fragmentView;
}
}
最佳答案
发现可用蓝牙设备的列表是异步的。收到广播后,BluetoothManager类可以将更新后的设备列表保存在列表成员变量中,并公开一个公共getter方法以从Activity或fragment中检索它。另外,由于设备可以不断地动态添加或删除,因此请考虑向您的活动公开侦听器以提供更新的列表。在任何时间点,UI都应在接收到更新的设备列表后刷新自身。public void onClick(View v) { bluetoothManager = new BluetoothManager(getContext()); ...}
是个坏主意。理想情况下,您必须在活动或片段的onCreate上实例化BluetoothManager类,这样才能在用户单击按钮之前提前发现设备列表。
我的建议是:
在Activity的onCreate上实例化BluetoothManager,更改构造函数以接受回调对象,以在设备列表更改时通知。
在BluetoothManager中收听广播,以识别设备的添加或删除。更新您的本地列表,每当发生更新时,通知UI的回调
每当您从BluetoothManager类收到更新时,在活动/片段中实现回调并更新UI。
当用户单击按钮时,调用BluetoothManager以获取设备的更新列表并更新您的UI。
从您的活动的onDestroy上注销在BluetoothManager中注册的广播(非常重要。否则会导致内存泄漏)
或者,如果您想与多个活动共享Bluetooth管理器实例,请将BluetoothManager设置为单例并向应用程序上下文注册BroadcastReceiver。当您所有的活动都被破坏并且不再需要接收器时,请确保注销广播接收器。
更新:
回调可能只是您的活动或片段实现的接口。下面的示例代码:
public interface BluetoothDevicesAvailable {
void onBluetoothDeviceListChanged(List<BluetoothDevice> deviceList);
}
public class SomeActivity implements BluetoothDevicesAvailable {
//... Some code
@Override
public void onBluetoothDeviceListChanged(List<BluetoothDevice> deviceList) {
//Add your logic here to update UI
}
}