use*_*604 5 singleton android bluetooth
我创建了一个类 ManageConnection 来处理所有蓝牙连接。该类实现了单例模式。
但我有以下问题,不知道如何从我的类 ManageConnection 中判断一个活动,例如设备连接成功。
ManageConnection 类将使用各种活动。
谢谢。
小智 7
您可以通过多种方式做到这一点:
1.使用广播接收器。在您的活动中:
BroadcastReceiver mReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
// Do what you need in here
}
};
@Override
protected void onResume() {
super.onResume();
registerReceiver(mReceiver, new IntentFilter(ManageConection.BROADCAST_FILTER));
}
@Override
protected void onDestroy() {
unregisterReceiver(mReceiver);
super.onDestroy();
}
Run Code Online (Sandbox Code Playgroud)
来自你的ManageConection班级:
public static final String BROADCAST_FILTER = "ManageConection_broadcast_receiver_intent_filter";
Run Code Online (Sandbox Code Playgroud)
现在,每当您想发送消息时,您都可以发送消息Intent,并且每个活动如何使用相同的 filter( BROADCAST_FILTER) 保持接收器获取回调:
Intent i = new Intent(BROADCAST_FILTER);
i.putExtra("connection_established", true);
sendBroadcast(i);
Run Code Online (Sandbox Code Playgroud)
2.使用interface:在应用程序的某个位置创建一个接口。从每个活动创建它的一个实例,并将其传递给ManageConection:
public interface ManageConection {
public void onConnected();
}
private ManageConection mCallback = new ManageConection() {
@Override
public void onConnected() {
// callback goes here
}
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
ManageConection.getInstace().setConnectionCallback(mCallback);
}
Run Code Online (Sandbox Code Playgroud)
设置ManageConection回调的全局变量并将其设置为setConnectionCallback():
private ManageConection mCallback;
public void setConnectionCallback(ManageConection callback) {
mCallback = callback;
}
Run Code Online (Sandbox Code Playgroud)
现在,当您想向您的活动发送回调时,只需执行以下操作:
if(mCallback != null)
mCallback.onConnected();
Run Code Online (Sandbox Code Playgroud)
定义一个接口并使用回调让活动知道设备已连接或接收到数据。
public interface BluetoothDeviceListener {
void onDeviceConnected(int arg1, string arg2); ..<----add arguments you want to pass back
void onDataReceived(int arg1, string arg2); ..<----add arguments you want to pass back
}
Run Code Online (Sandbox Code Playgroud)
在您的 ManageConnection 类中
ArrayList<BluetoothDeviceListener> listeners = new ArrayList<BluetoothDeviceListener>();
...
public void addBluetoothDeviceListener(BluetoothDeviceListener listener){
if (!listeners.contains(listener){
listeners.add(listener);
}
}
public void removeBluetoothDeviceListener(BluetoothDeviceListener listener){
if (listeners.contains(listener){
listeners.remove(listener);
}
}
Run Code Online (Sandbox Code Playgroud)
当设备连接时:
for (BluetoothDeviceListener listener:listeners){
listener.onDeviceConnected(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)
收到数据时:
for (BluetoothDeviceListener listener:listeners){
listener.onDataReceived(arg1, arg2);
}
Run Code Online (Sandbox Code Playgroud)
在您的活动中:
public class MainActivity extends Activity implements BluetoothDeviceListener{
...
@Override
public void onCreate(Bundle savedInstanceState)
{
...
manageConnection.setDeviceConnectedListener(this);
...
}
public void onDeviceConnected(int arg1, string arg2){
// do whatever you need to do
}
public void onDataReceived(int arg1, string arg2){
// do whatever you need to do
}
Run Code Online (Sandbox Code Playgroud)
全部凭记忆,如有错别字请见谅。
这种方法使类解耦。连接管理器类不了解这些活动。它只是回调所有注册的监听器。这些侦听器可能是活动,也可能是服务。它们可能是 MySparklyUnicorn 的实例。服务器既不知道也不关心。它只是说“如果有人感兴趣,设备已连接,这里是详细信息”。
| 归档时间: |
|
| 查看次数: |
6773 次 |
| 最近记录: |