0

メインアクティビティを含むアプリケーションがあります。このアプリケーションには、すべてのアプリケーションセットアップオプションといくつかのユーザー選択を備えた非常にシンプルな画面があります。メイン画面のボタンは他のアクティビティを開始します。

(1)現在、Bluetoothスキャナーをアプリケーションに実装しています。設定を編集し、メインアクティビティでBluetooth接続を確立し、その接続を(バンドルまたはパーセル可能で?)他のアクティビティに渡すことができるようにしたいと思います。

接続を渡す方法としてBundleを調べましたが、値としてプリミティブ型と基本型のみを受け入れるようです。Intent.putExtra(String、Parcelable)が利用可能であることに気づきましたが、Parcelは私を混乱させました。これを実装するための最良の方法は何でしょうか、それとも可能ですか?

いくつかの関連コード:

//subclass definitions for the Runnables which start the applications in their own threads
private final Handler smsHandler = new Handler();
private final Handler smsOutHandler = new Handler();

private final Runnable smsIntentRunnable = new Runnable() {
    public void run() {
        Intent smsIntent = new Intent(smsMobile.this, smsActivity.class);
        startActivity(smsIntent);
    }
};

private final Runnable smsOutIntentRunnable = new Runnable() {
    public void run() {
        Intent smsOutIntent = new Intent(smsMobile.this, smsOutActivity.class);
        startActivity(smsOutIntent);
    }
};

//button listeners located in onCreate(), which start the Activities
newTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsHandler.post(smsIntentRunnable);
    }
});

updateTicket.setOnClickListener(new View.OnClickListener() {
    public void onClick(View v) {
        smsOutHandler.post(smsOutIntentRunnable);
    }
});

(2)データベース接続も渡すことはできますか?SQLiteOpenHelperをサブクラス化する必要があることを理解しています。これにより、IPCが複雑になる可能性がありますが、それでもどういうわけか可能だと思いましたか?

4

2 に答える 2

1

2つのアクティビティ間でBluetoothサービスを共有するためにアプリを書き直しているところです。以前は、開始アクティビティ(サービスがセットアップされ、他のアクティビティが起動される場所)でBluetoothサービスをパブリックオブジェクトとして初期化し、次に.read()と.write()を呼び出すことで問題を解決しました。 )新しい活動からの公共サービスの機能。これは書き込みには問題なく機能しますが、読み取りには少し面倒です(データが戻ってくることを期待するたびにスレッドを起動し、座ってデータを待つ必要があります)。他のすべてのプロジェクトを移行して、特定のキーデータがサービスによって読み取られたときにBluetoothサービスハンドラーからキューに入れられた特定のアクションを実行するようにしました(たとえば、コード化された温度データを受信したときにユーザーインターフェイスの温度を更新します)。両方の活動でよりエレガントな読書ができるようにするには、

/**
 * Change the handler (route handler info to new activity). */
public synchronized void newHandler(Handler handle) {
    mHandler = handle;
}

次に、この関数を呼び出して、新しいアクティビティの起動時に新しいアクティビティから新しいハンドラーを再割り当てします(例: "StartingActivity.mBTService.newHandler(NewActivityHandler);")もちろん、StartingActivityに戻るときは、必ずハンドラーを再割り当てしてください。適切に;-)

驚いたことに、Bluetoothサービスをシングルトン、パーセル可能なオブジェクト、またはアプリケーションを介したグローバルサービスにする必要がなく、すべてのオーバーヘッドなしで機能します(いずれも正常にコーディングできませんでした)。

私はもっ​​と徹底的にテストするつもりですが、うまくいけば、これが誰かに役立つことを願っています(私が何かを返す頃-私はこのコミュニティから多くを学びました)!

于 2013-07-16T06:06:24.123 に答える
0

アクティビティとサービス間でデータを共有するためのいくつかのオプションがあります。

更新:状況を少し拡張するために:

コードが別々のプロセスで実行される場合にのみ、IPC/Parcelableが必要です。コードを個別のプロセスで実行するには、マニフェストで指定する必要があります:http: //developer.android.com/guide/topics/fundamentals.html#procthread

  1. あなたの場合、アクティビティは同じプロセスで実行されると想定しているので、カスタムApplicationクラスを使用してこのデータを保存/共有できます。synchronized別のスレッドからアクセスする場合は、それを確認してください。または、最初のリンクにリストされている他のアプローチを使用することもできます。

  2. もちろん、これは1つのJavaアプリケーションであるため、同じプロセス内でデータベース接続を渡すことができます。ただし、プロセス間でIPCを介して渡すことはできません。これは、すべてのクラスがIPCを介して渡すためにParcelableを実装する必要があり、AFAIK、SQLiteDatabaseはparcelableを実装しないためです(ネイティブ関数と通信するクラスは通常実装しません)。

于 2011-02-17T14:43:54.537 に答える