0

次のようなアプリを実装する方法を考えています。

- x 個のソケットを開きます (ユーザー指定)
- 各ソケットは、アプリケーションの有効期間中開いたままにし、バックグラウンドで実行し続けます -
同じレイアウトの複数のアクティビティを作成します。それぞれは、ソケットから受信した情報を表示するために使用されます。

現在、1 つのソケットから送受信を行う実装があります。サービスはバックグラウンドで実行され、ソケットからの情報の処理を続行し、それをアクティビティに送信します。しかし、私の現在の考えでは、ソケットをバックグラウンドで処理し続けるには、開いているソケットごとに 1 つのサービスが必要であると考えています。私はAndroidにかなり慣れていないので、いくつかの明確化が素晴らしいでしょう.

ありがとう

4

2 に答える 2

0

すべてのソケット接続を管理する単一のサービスを実装します。サービスは AndroidManifest で定義されるため、同じタイプの複数のサービスを実行することはできず、実行時にサービスを作成することはできません (実行時に新しいサービスを定義することはできません)。そのため、単一のサービスを使用することにこだわっています。これは、サーバーへの各接続を表す Class のインスタンスを複数持つことができないという意味ではありません。実際、私が推奨するのはまさにそれですが、これらのインスタンスは Android サービスではありません。

アクティビティについても同じことが言えます。アクティビティの複数のインスタンスを同時に作成することは実際にはできません。Android は、そのように見せるために多くのトリックを実行しますが、実際には、前回と同じインスタンスか、そのインスタンスがなくなって新しいインスタンスが表示されるかのいずれかです。ただし、一度に存在するアクティビティのインスタンスは 1 つだけです。したがって、これらの制限に対処する必要がありますが、それらは大量のメモリを使い切らないようにするためのものです。

つまり、チャット セッションを表示するアクティビティは、表示するセッションによってパラメータ化できるように柔軟である必要があります。これは、インテントの追加パラメーターを使用して簡単に実行できます。例えば:

public void openSession( ChatSession session ) {
    Intent intent = new Intent( getContext(), ChatSessionActivity.class )
         .putExtra( ChatSessionActivity.PARAM_CHAT_SESSION_ID, session.getID() );
    startActivity( intent );
}

これは、別のアクティビティがユーザーを ChatSession にナビゲートする方法です (たとえば、チャット セッションのリストから選択するなど)。アクティビティでは、onCreate() に渡されたインテントを確認し、サービスに接続してから、サービスに ChatSession をクエリします。更新を取得するには、ChatSessionActivity をサービスに登録および登録解除できるメカニズムが必要です。これは、BroadcastReceivers、登録リスナー、メッセージなどを使用することで実現できます。多数のオプションがあります。例えば:

public void onServiceConnected() {
   ChatSession session = service.getSession( sessionId );
   session.setChatListener( this );
}

public void onStart() {
    if( service.isConnected() ) session.setChatListener(this);
}

public void onStop() {
   session.setChatListener( null );
}

とにかく、これらはプログラムを構築する方法についての簡単なアイデアにすぎません。

于 2012-06-04T22:08:54.503 に答える
0

1 つのサービスだけを使用します。コードをサービス内で実行する場合でも、ネットワーク関連のすべての操作を別のスレッド / asynctask 内で実行する必要があることに注意してください。そうしないと、UI スレッドがフリーズしてしまいます。

もし私があなただったら、アンドロイドでも利用できるJava nio フレームワークを見てみたいと思います。多くの接続を簡単に開いたり管理したりできるはずです。

アクティビティに関しては、1 つのアクティビティ (つまり、1 つのアクティビティ クラス) を使用して、それが参照する接続に従って区別します。

最後に、電話のリソースは限られていることを忘れないでください。複数のソケットを開く (さらに、それらをバックグラウンドで接続したままにする) と、バッテリーが消耗する可能性があります。

アプリがバックグラウンドで実行され続けることをユーザーに警告する必要があります。たとえば、アプリがバックグラウンドで実行されるたびに通知アイコンで通知する必要があります。

于 2012-06-04T22:50:47.090 に答える