私はアンドロイドが初めてで、そのための簡単なアプリケーションを作成したいと考えています。これがどのように機能するかです:
- アプリには、メイン アクティビティ、プレーヤー アクティビティの作成、接続拒否アクティビティの 3 つのアクティビティがあります。
- 主な活動はプレーヤーのリストを示しています
- create player アクティビティにより、ユーザーはアカウントを作成できます
- サーバーとの接続が中断されたときに接続拒否アクティビティが表示される
- アプリ フローは次のようになります (「->」は、アプリケーションが 1 つのアクティビティから別のアクティビティに移動できることを意味します)。
- メイン->作成
- create->main (戻るボタンを使用)
- *->connection_refused->* : このアクティビティは特別です。サーバーとの接続が拒否されたときに一番上に表示されるため、他のアクティビティから独立しており、いつでも表示できます。
- アプリケーションでソケット接続を使用
- すべてのアクティビティは、データが変更されたとき
observer
に通知されるようになっています。次に例を示します。observable
- ユーザーがアカウントを作成しました: サーバーは、一部のユーザーがアカウントを作成したという通知をすべてのユーザーに送信するため、プレーヤーのリストを
main activity
更新する必要があります - サーバーはいくつかの問題のためにシャットダウンされました: クライアントは 5 秒ごとに接続をチェックし、接続が拒否された場合は
connection refused
アクティビティに通知を送信します。その後、情報アクティビティは他の (アクティブな) アクティビティの上に表示されます。 connection refused
アクティビティが常に有効で、いつでも表示/非表示を切り替えることができれば最高です
- ユーザーがアカウントを作成しました: サーバーは、一部のユーザーがアカウントを作成したという通知をすべてのユーザーに送信するため、プレーヤーのリストを
問題:
connection refused
他の (アクティブな) アクティビティの上にアクティビティを表示する方法は? アプリ内のほとんどすべてが正しく機能します (接続が拒否されたアクティビティには、接続が拒否されたことが通知されます) が、それを一番上に表示する方法がわかりません。- アクティビティはこの問題に適していますか、それとも他の解決策を使用する必要がありますか?
- サーバーとの接続が拒否された場合、すべてのアクティビティがブロックされ、
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();
}
}
}
});
}
}
- 使用例:
- ユーザーは主な活動中です
- ユーザーは新しいプレーヤーを作成したいので、ユーザー アクティビティを作成します。
- ユーザーは「ユーザーの作成」をクリックしたいのですが、現時点ではサーバーとの接続が拒否されています
connection refused activity
接続が拒否されたことが通知されるため、「接続が拒否されました。再接続しますか?」という情報が表示されます。ユーザーへ- ユーザーが [はい、再接続します] をクリックします。この時点でサーバーは動作しているため、アプリケーションは再接続を試みて非表示にします
connection refused activity