を開始するアクティビティがありますIntentService
:
intent = new Intent(MyApplication.getAppContext(), MyService.class);
intent.putExtra("EXTRA_DEVICE_ADDRESS", value);
MyApplication.getAppContext().startService(intent);
サービスは、送信した MAC アドレスで Bluetooth 接続を開始します。
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);
}
を使用しBroadcastReceiver
て、サービスからメッセージを受信します。
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 が動かなくなる。を使用しようとしましたAsyncTask
が、うまくいきませんでした。write()
その静的メソッドの使用をやめて、サービスにメッセージを送信し、彼に任せる必要があると思います。アクティビティでを初期化しHandler
、 を介してインテントでサービスに送信する必要があると思いますstartService()
。
サービスに出入りするメッセージを追跡したい。着信メッセージで正常に動作しています。アクティビティからメッセージを適切に受信して実行し、情報をアクティビティに送り返す方法を見つける必要があります。