2010-11-24 19 views
1

私はAndroidで正しくサービスを使用する方法についていくつかのアドバイスを探しているアンドロイドのnoobです。 TCP経由でデータストリームを取得するために、インターネット上のサーバーに接続するアプリケーションを構築しています。そのデータは、Bluetoothシリアルポート経由で接続されている別のデバイスに送信する必要があります。ユーザーが別のアクティビティを見ている間、この機能をバックグラウンドで引き続き機能させたいと思っています。Androidサービスのデザイン - アクティビティを開始するか、必要なときにのみ開始しますか?

このアプリは、インターネットからリアルタイムRTK補正データを取得し、ブルートゥース経由でRTK GPS受信機に送信するNTRIPクライアントになります。データレートは約500バイト/秒になります。ユーザーインターフェイスは、データストリームを接続または切断するための単一のボタンと、GPS受信機のステータスを示すテキストです。また、接続するサーバーのIP /ポートや通信するブルートゥースデバイスなど、ユーザーが設定する必要がある設定がいくつかあります。

私は主な活動がローカルサービスを生成し、サービスがTCPストリーム用のスレッドを生成し、Bluetooth接続用のスレッドをスポーンする必要があると思います。これは正しいと思いますか?

このシナリオでは、サービスに最適なモデルは何ですか?

- アクティビティが開始するたびにサービスを開始(バインド)し、接続/切断ボタンでサービスにコマンドを送信してスレッドを開始/停止させます。私がこのルートに行くと、ユーザーが切断して別のアプリに行くと、サービスは引き続き実行されます。このサービスは、自身を終了させるための休止タイマーが必要です。

- ユーザーが接続/切断ボタンを押したときにサービスを開始し、サービスを停止します。このサービスは、データが移動しているときにのみ実行されます。これを行うと、アクティビティの起動時にサービスが実行されているかどうかを確認して、サービスにバインドする必要があるかどうかを知るか、リンクが切断されたことをユーザーに伝える必要があります。

ありがとうございました。

答えて

1

私はあなたの2番目の選択肢に行きます。サービスが動作しているかどうかを確認するのは簡単な作業ですが、バッテリの寿命を延ばすために不要な処理時間を消費することもありません。

サービスをバックグラウンドで長時間実行することができたとしても、必ずしもそうする必要はありません。少なくともすべての時間ではありません。

0

Androidはアプリケーションに複数のエントリポイントをサポートするため、Manifest.xmlに2つのエントリポイントを定義できます。 <category android:name="android.intent.category.LAUNCHER" />は、このクラスをランチャーから起動できることを定義しています。私はそれもサービスのために働くだろうと思う。私は2つのエントリポイントを行うだろう。最初にアクティビティーを生成し、ユーザーにいくつかの構成制御を提供するもの。そして単にサービスを生み出す別のもの。

アクティビティのライフタイムを制御できないため、システムで終了してはならないものは何もしないことを提案します。着信があった場合、あなたの活動は単に死ぬでしょう。 ユーザーがサービスを開始した場合、ボタンでウィジェットを作成できます。ユーザーがアクティビティを開始すると、サービスとウィジェットを開始できます。 そして、ユーザーがウィジェットを開始すると、ユーザーはそのサービスで何が起こるべきかを決定します。

+0

部分的に間違っていて、他の部分は完全に混乱している可能性があります。 –

0

私はJavaやAndroidのプログラマーではないので、私は塩の穀物で言うことを取る。 JavaにおけるIOのブロックを処理する通常の方法は、スレッドを使用することです。データフローは単方向であるように思えますが、柔軟性を最大限に高めるために、UI用、TCP接続用、およびBluetooth接続用の3つのスレッドを作成します。UIと2つのワーカースレッド間の通信は、共有変数(同期、競合条件などに注意する必要があります)を使用して行うことができます。私はマルチスレッドキューデータ構造を使用して、データNTRIPデータを他のワーカーに渡します。

NTRIPデータのワーカースレッドはおおよそ次のようになりますブルートゥーススレッドの

while (app running) { 
    if (connection enabled) { 
     if (not connected) { 
     c = connect to remote 
     } 
     data = get data from c 
     queue.put(data) 
     if (options reconfigured) { 
     close c 
     } 
    } 
} 

:正常状態で

while (app runnning) { 
    data = queue.get() 
    if (UI settings changed and connected) { 
     close connection 
    } 
    if (not connected) { 
     c = connect to remote 
    } 
    send data over connection 
} 

、両方の労働者は、IOでブロックされており、本質的に消費されますCPU時間はありません。私の経験に基づいて、通信エラーを処理するコードを書くことをお勧めします。現実世界でうまく動作するようにするには、クローズやハンギングなどの接続を処理する必要があります。ロバストにすることは、開発の最も時間のかかる部分です。

関連する問題