在不同的Android活动中维护套接字到服务器

时间:2017-06-13 18:11:05

标签: java android sockets

我是Android编程的新手,我的应用程序应该创建一个套接字,以便在用户改变不同的活动时保持与服务器的持续联系(获取状态和更新等)。

我想知道用户如何能够在保持与服务器的持续连接的同时更改为不同的活动类。

我可能在主要活动中创建一些后台处理程序,即使玩家更改为其他活动也会一直运行。

该处理程序将是与服务器保持联系的实体,如某种后台任务,并且还会传递状态以显示当时正在运行的任何活动。

类似

 OnCreate(....)
 {
                handler=new Handler();
                handler.postDelayed(new Runnable() {
                    @Override
                    public void run() {
                          tick();
                          handler.postDelayed(this,1000);
                    }
                },1000);
  }

 void tick()
  {
    communicate with server
  }

但是如果用户更改为其他活动,处理程序是否仍然运行呢?即使在运行不同的活动时,套接字仍然可以从服务器接收数据,如果我设置某种类型的套接字回调,它在获取数据时调用函数,但该回调将在主活动中,如何调用它如果另一项活动有效?

此外,如何将从套接字获取的新信息传递给正在运行以更新其UI的任何活动。我想象有一个所有活动都可以访问的数据结构,由线程或与服务器通信的任何内容填充。

看起来相当复杂,有没有人有例子或知道标准的做法?

由于

1 个答案:

答案 0 :(得分:0)

这对我有用,但我非常确定有更好的方法可以在更改活动时保持套接字连接的活跃状态,比如使用服务(正如我已阅读但尚未尝试过)。您可以在此处查看服务示例:Services Example

在我的主要活动(我创建套接字的地方)

    public static Socket socket;

    public static   Socket getSocket(){
        return socket;
    }

    public static synchronized void setSocket(Socket socket){
        MainActivity.socket = socket;
    }

 public class ClientThread implements Runnable {

        @Override
        public void run() {
            try {
                InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
                socket = new Socket(serverAddr, SERVERPORT);
                setSocket(socket);
                if(socket!=null){
                    Intent goToNextActivity = new Intent(getApplicationContext(), SecondActivity.class);
                    startActivity(goToNextActivity);
                }

            } catch (UnknownHostException e1) {
                e1.printStackTrace();

            } catch (IOException e1) {
                e1.printStackTrace();

            }
        }

    }

在我的第二个活动中,我只是这样称呼它使用我创建的同一个套接字(例如)

MainActivity.getSocket().getOutputStream().write(String.valueOf(multiplier).getBytes());

适合我!