解决这个问题大抵有三种方法:
1、使用单例模式
2、将socket封装在service中
3、application实体类
前两种方法,Stackflow上有较多的实现方式,但个人认为短时间内较难上手,而且不方便及时处理接收到的信息
所以我们来讨论一下第三种方法
这种方法的实质,我认为就是把socket当做一个全局变量
1、首先,实现MySocket类
public class MySocket extends Application{
Socket socket = null;
public Socket getSocket(){
return socket;
}
public void setSocket(Socket socket){
this.socket = socket;
}
}
setSocket()是在第一次在某个activity中socket初始化后,将其保存下来
getSocket(),其他的acticity中调用,便可获得之前建立过的socket,从而达到共享目的
2、设置AndroidManifest.xml
<application
android:name=".MySocket" <!-设置application实体类->
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
3、首次初始化socket(这也算是比较优良的在Android中实现socket的例子)
Socket socket = null;
BufferedReader reader = null;
BufferedWriter writer = null;
public void connect() {
AsyncTask<Void, String, Void> read = new AsyncTask<Void, String, Void>() {
@Override
protected Void doInBackground(Void... arg0) {
try {
socket = new Socket("120.77.244.212", 11332);
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
publishProgress("@success");
((MySocket)getApplication()).setSocket(socket);
} catch (UnknownHostException e1) {
//Toast.makeText(Client.this, "无法建立链接", Toast.LENGTH_SHORT).show();
} catch (IOException e1) {
//Toast.makeText(Client.this, "无法建立链接", Toast.LENGTH_SHORT).show();
}
try {
String line;
while ((line = reader.readLine()) != null) {
publishProgress(line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return null;
}
@Override
protected void onProgressUpdate(String... values) {
if (values[0].contains("@success")) {
Toast.makeText(secondActivity.this,"链接成功!", Toast.LENGTH_SHORT).show();
}
super.onProgressUpdate(values);
}
};
read.execute();
}
public void send(String order) {
try {
writer.write(order + "\n");
writer.flush();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我加粗的那行代码,((MySocket)getApplication()).setSocket(socket); 首次初始化后socket,赋值给全局
4、在其他activity中再调用
socket = ((MySocket)getApplication()).getSocket();
writer = new BufferedWriter(new OutputStreamWriter(socket.getOutputStream()));
reader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
大致上就是如此,可以较为便捷的实现我们的目的。此外再提醒一点,别忘了在AndroidManifest.xml中添加各种需要的权限