我是android新手,我想为它创建一个简单的应用程序。这就是它的工作原理:
应用程序有3个活动:主活动、创建播放器活动、连接被拒绝活动。
主要活动显示玩家列表
创建玩家活动允许用户创建帐户
当与服务器的连接被中断时,将显示“连接被拒绝”活动
应用程序流如下所示(“->”表示应用程序允许从一个活动转到另一个活动):
主>创建
创建->主菜单(使用后退按钮)
*->连接被拒绝->*:此活动是特殊的,因为当与服务器的连接被拒绝时,它将显示在顶部,因此它独立于其他活动,可以随时显示
应用程序中使用了套接字连接
每个活动都是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

最佳答案

这就是你能做的,
不要让ConnectionRefusedActivity作为观察者。你休息的2个活动应该是观察者。最好的方法是,保留一个实现observer的baseactivity。当通知观察者时,通过调用ConnectionRefusedActivity打开startActivityForResult。当用户尝试重新连接时,将结果发送回以便重新连接。在各自的活动中再次进行重新连接。

10-08 09:18