すべてのソケット接続を管理する単一のサービスを実装します。サービスは 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 );
}
とにかく、これらはプログラムを構築する方法についての簡単なアイデアにすぎません。