はまった。
Androidアプリに、Bluetoothの機能を持たせたいとき。
公式のサンプルであるBluetoothChatでは、
今Bluetoothの機能がOFFになっていたら、ONにするため、
onStartの中で、mBluetoothAdapter.isEnabled()を呼び出して確認しています。
で、OFFになってたら、startActivityForResultを使って端末の設定画面に飛んで、ユーザに手動で
BluetoothをONにしてもらってます。
@Override
public void onStart() {
super.onStart();
if(D) Log.e(TAG, "++ ON START ++");
if (!mBluetoothAdapter.isEnabled()) {
Intent enableIntent = new Intent(BluetoothAdapter.ACTION_REQUEST_ENABLE);
startActivityForResult(enableIntent, REQUEST_ENABLE_BT);
} else {
if (mChatService == null) setupChat();
}
}
こう。
その次のonResumeで、接続の初期化をしてます。
@Override
public synchronized void onResume() {
super.onResume();
if(D) Log.e(TAG, "+ ON RESUME +");
if (mChatService != null) {
if (mChatService.getState() == BluetoothChatService.STATE_NONE) {
mChatService.start();
}
}
}
こう。
で、このプログラムだと、最初にBluetoothの機能がOFFのときのプログラムの流れは、
プログラム開始
↓
onCreate()
↓
onStart()
↓
onResume()
↓
onPause()
↓
設定画面へジャンプ
↓
onResume()
というかんじで、onResume()を二回通っているのです。
だから、一回目のonResume()では、まだBluetooth機能がONになってないから、通信の初期化処理を防ぐ機構が必要なのです。
サンプルプログラムでは、mChatServiceがnullかどうか、というのがBluetooth機能のON/OFF状態を示すフラグの代わりになってます。
であるので、mChatServiceをなくしちゃおうと画策する俺のような人は、Bluetooth機能のON/OFFフラグをちゃんと作らないといけないのです。
たぶん。
0 件のコメント:
コメントを投稿