我有一个活动开始IntentService
:
intent = new Intent(MyApplication.getAppContext(), MyService.class);
intent.putExtra("EXTRA_DEVICE_ADDRESS", value);
MyApplication.getAppContext().startService(intent);
该服务使用我发送的 MAC 地址启动蓝牙连接。
device = mBluetoothAdapter.getRemoteDevice(macAddress);
public ConnectThread(BluetoothDevice device) {
this.mmDevice = device;
BluetoothSocket tmp = null;
try {
tmp = device.createRfcommSocketToServiceRecord(UUID.fromString(SPP_UUID));
} catch (IOException e) {
e.printStackTrace();
}
mmSocket = tmp;
}
我听:
while (true) {
try {
if (mmInStream.available() != 0) {
bytes = mmInStream.read(buffer);
String readMessage = new String(buffer, 0, bytes);
sendMessageToActivity("incoming", readMessage);
} else {
SystemClock.sleep(100);
}
并将收到的消息发送回活动:
public void sendMessageToActivity(String type, String message) {
intent = new Intent(BROADCAST_ACTION);
intent.putExtra(type, message);
sendBroadcast(intent);
}
我使用 aBroadcastReceiver
从服务接收消息:
private BroadcastReceiver mMessageReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context context, Intent intent) {
updateUI(intent);
}
};
我从活动中调用(问题的一部分):
private void writeOut(final String message) {
msg = message;
byte[] send = msg.getBytes();
MyService.write(send);
}
这是服务的静态write()
方法:
public static void write(byte[] out) {
// Create temporary object
ConnectedThread r;
// Synchronize a copy of the ConnectedThread
synchronized (obj) {
if (mState != STATE_CONNECTED)
return;
r = mConnectedThread;
}
// Perform the write unsynchronized
r.write(out);`
}
我的问题:上述所有工作都按预期工作,除了MyService.write(send)
. UI 卡住了。我尝试使用 anAsyncTask
但它没有用。我认为我需要停止使用该静态write()
方法并将消息发送到服务并让他完成这项工作。我相信我需要Handler
在活动中初始化 a ,通过意图将其发送到服务startService()
。
我想跟踪进出服务的消息。它可以很好地处理传入的消息。我需要找到一种方法来正确接收来自活动的消息,执行它们,然后将信息发送回活动。