3

我是 android 新手,我想为它创建简单的应用程序。这是它应该如何工作的:

  1. App 有 3 个活动:主要活动,创建玩家活动,连接拒绝活动。
    • 主要活动显示玩家列表
    • 创建玩家活动允许用户创建帐户
    • 与服务器的连接中断时显示连接被拒绝活动
  2. 应用程序流程如下所示(“->”表示应用程序允许从一个活动转到另一个活动):
    • 主->创建
    • create->main(使用后退按钮)
    • *->connection_refused->* :这个活动很特别,因为它会在与服务器的连接被拒绝时显示在顶部,因此它独立于其他活动,可以随时显示
  3. 应用程序中使用套接字连接
  4. 每个活动observer都会observable在数据更改时收到通知,例如:
    • 用户已创建帐户:服务器将通知所有用户,某些用户已创建帐户,因此main activity需要更新玩家列表
    • 由于某些问题,服务器已关闭:客户端每 5 秒检查一次连接,如果连接被拒绝,它将向connection refused活动发送通知。之后,信息活动应显示在其他(活动)活动之上。
    • 最好的情况是connection refused活动一直存在,所以我可以随时显示/隐藏它

问题:

  1. 如何connection refused在其他(活动)活动之上显示活动?应用程序中的几乎所有内容都正常工作(连接被拒绝的活动被通知连接已被拒绝),但我不知道如何将其置于顶部。
  2. 活动对这个问题有好处还是我应该使用其他解决方案?
  3. 如果与服务器的连接被拒绝,则所有活动都应被阻止,connection refused活动应显示在顶部。用户不应该有可能回到被阻止的活动。

ConnectionRefusedActivity:

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 回答