1

メインアクティビティでユーザーが 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()

4

2 に答える 2

1

startActivityOnResultstartActivityの代わりに使用し、アクティビティを終了する場合は、で使用されているのと同じリクエストコードでfinishActivity(int requestCode)を使用します。startActivityOnResult

編集:
アプリケーションでハンドラーのArrayListを作成し、アプリケーションクラスで静的BluetoothRemoteControlAppフィールドを作成して、これを現在のアプリケーションクラスインスタンスにインスタンス化します。

各アクティビティでハンドラーを作成します。ActivityのOnresumeで、BluetoothRemoteControlAppの静的フィールドを使用してこのハンドラーをアプリケーションに登録します。

Connectionがドロップされるとすぐに、すべてのハンドラーとsendmessageを繰り返し処理します。すべてのハンドラーで、handleMessageはfinish()を使用します。

Onpauseで、このハンドラーをアプリケーションから削除します

于 2012-08-15T09:24:15.710 に答える
0

intent.addFlags( Intent.FLAG_ACTIVITY_CLEAR_WHEN_TASK_RESET );接続後に起動するときなどにフラグを設定できますActivity。これにより、タスクをリセットするときにアクティビティのバック スタックをアンロールできます。

于 2012-08-15T09:36:59.157 に答える