3

私はアンドロイドが初めてで、そのための簡単なアプリケーションを作成したいと考えています。これがどのように機能するかです:

  1. アプリには、メイン アクティビティ、プレーヤー アクティビティの作成、接続拒否アクティビティの 3 つのアクティビティがあります。
    • 主な活動はプレーヤーのリストを示しています
    • create player アクティビティにより、ユーザーはアカウントを作成できます
    • サーバーとの接続が中断されたときに接続拒否アクティビティが表示される
  2. アプリ フローは次のようになります (「->」は、アプリケーションが 1 つのアクティビティから別のアクティビティに移動できることを意味します)。
    • メイン->作成
    • create->main (戻るボタンを使用)
    • *->connection_refused->* : このアクティビティは特別です。サーバーとの接続が拒否されたときに一番上に表示されるため、他のアクティビティから独立しており、いつでも表示できます。
  3. アプリケーションでソケット接続を使用
  4. すべてのアクティビティは、データが変更されたとき observerに通知されるようになっています。次に例を示します。observable
    • ユーザーがアカウントを作成しました: サーバーは、一部のユーザーがアカウントを作成したという通知をすべてのユーザーに送信するため、プレーヤーのリストをmain activity更新する必要があります
    • サーバーはいくつかの問題のためにシャットダウンされました: クライアントは 5 秒ごとに接続をチェックし、接続が拒否された場合はconnection refusedアクティビティに通知を送信します。その後、情報アクティビティは他の (アクティブな) アクティビティの上に表示されます。
    • connection refusedアクティビティが常に有効で、いつでも表示/非表示を切り替えることができれば最高です

問題:

  1. connection refused他の (アクティブな) アクティビティの上にアクティビティを表示する方法は? アプリ内のほとんどすべてが正しく機能します (接続が拒否されたアクティビティには、接続が拒否されたことが通知されます) が、それを一番上に表示する方法がわかりません。
  2. アクティビティはこの問題に適していますか、それとも他の解決策を使用する必要がありますか?
  3. サーバーとの接続が拒否された場合、すべてのアクティビティがブロックされ、connection refusedアクティビティが一番上に表示されます。ユーザーは、ブロックされたアクティビティに戻る可能性があってはなりません。

接続拒否アクティビティ:

public class ConnectionRefusedActivity extends Activity implements Observer {

    private ServerService service;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        service = ServerService.getInstance();
        service.addObserver(this);

        progressDialog = new ProgressDialog(this);
        alertDialog = new AlertDialog.Builder(this).create();
        alertDialog.setMessage("Unable to connect to server. Click OK to reconnect.");
        alertDialog.setButton("OK", new OnClickListener() {
            @Override
            public void onClick(DialogInterface dialog, int which) {
                service.connect();
            }
        });
        progressDialog.setMessage("Please wait...");
        // this method tries to connect to server; if it fails `service` will sernd notification to this activity with data `false`
        service.connect();
    }

    @Override
    public void update(final Observable observable, final Object data) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                if (observable instanceof ServerService) {
                    boolean isConnected = (Boolean) data;
                    if (isConnected) {
                        progressDialog.dismiss();
                        alertDialog.dismiss();
                    }
                    else {
                        // this will be called if connection with server has been refused; the problem is that I don't know how to bring this activity to top
                        // ATTENTION! I want to bring this activity to top here
                        progressDialog.show();
                        alertDialog.show();
                    }
                }
            }
        });
    }
}
  1. 使用例:
    • ユーザーは主な活動中です
    • ユーザーは新しいプレーヤーを作成したいので、ユーザー アクティビティを作成します。
    • ユーザーは「ユーザーの作成」をクリックしたいのですが、現時点ではサーバーとの接続が拒否されています
    • connection refused activity接続が拒否されたことが通知されるため、「接続が拒否されました。再接続しますか?」という情報が表示されます。ユーザーへ
    • ユーザーが [はい、再接続します] をクリックします。この時点でサーバーは動作しているため、アプリケーションは再接続を試みて非表示にしますconnection refused activity
4

1 に答える 1

1

これはあなたができることです、

ConnectionRefusedActivityをオブザーバーとして保持しないでください。あなたはオブザーバーでなければならない2つの活動を休んでいます。これを行う最善の方法は、Observer を実装する BaseActivity を保持することです。オブザーバーが通知されたら、ConnectionRefusedActivityを呼び出して を開きstartActivityForResultます。そして、ユーザーが再接続を試みると、再接続のために結果を送り返します。それぞれのアクティビティで、再接続をもう一度行います。

于 2013-06-02T18:36:23.203 に答える