メインアクティビティでユーザーが Bluetooth デバイスを選択し、アプリがそれに接続するアプリケーションがあります。次に、ユーザーがさまざまなアクティビティから選択できる新しいアクティビティが開始されます (Bluetooth デバイスとやり取りするにはさまざまな方法があります)。最後に、選択したアクティビティが開始され、ユーザーは満足します。
私の問題は、接続が失われたときに、何らかの形で活動活動と対話活動のリストを終了する必要があることです...しかし、どのように? アクティビティとブロードキャスト、ヘルパーの間でメッセージを渡すインテントについては聞いたことがありますが、実行中のスレッドから他の複数のアクティビティに情報を渡す方法の例はありません。
さまざまな接続スレッド (BluetoothChat の例から借用したもの) は Application クラスにあるため、どのアクティビティからでも書き込み関数にアクセスできます。それはまた、失われた接続を検出する場所でもあります。
私のアプリからの関連コードは次のとおりです。
アプリケーション クラス:
public class BluetoothRemoteControlApp extends Application {
public final int BT_CONNECTION_LOST = 1;
// . . .
private class ConnectedThread extends Thread {
// . . .
public void run() {
byte[] buffer = new byte[1024];
int bytes;
while (true) {
try {
bytes = mmInStream.read(buffer);
mHandler.obtainMessage(0, bytes, -1, buffer).sendToTarget();
} catch (IOException e) {
e.printStackTrace();
// the lost connection is detected here
connectionLost();
break;
}
}
}
// . . .
}
private void connectionLost() {
Log.e("BT", "Connection lost");
// inform that connection was lost,
// finish all activities and (re)start device select activity again
}
}
さまざまな活動(「アクション」と呼ばれる) が提案される活動:
public class ActionListActivity extends ListActivity {
ArrayList<Action> activityList = new ArrayList<Action>();
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
// list of available activities, arguments: title, description and class name
activityList.add(new Action("Accelerometer Control", "Control your robot by tilting the phone", "AccelerometerControl"));
// . . .
setListAdapter(new ActionListBaseAdapter(this, activityList));
}
@Override
protected void onListItemClick(ListView l, View v, int position, long id) {
super.onListItemClick(l, v, position, id);
String activity = activityList.get(position).getClassName();
try {
Class<?> activityClass = Class.forName("com.bluetooth.activities." + activity);
Intent intent = new Intent(ActionListActivity.this, activityClass);
startActivity(intent);
}
catch(ClassNotFoundException e) {
e.printStackTrace();
}
}
// add a method here to finish the activity when connection is lost
}
では、AccelerometerControl アクティビティを起動するとしましょう。メッセージを送信するために何を入力し、完了connectionLost()
するようにしますか?ActionListActivity()
AccelerometerControl()