1、主要代码实现:
public class SocketService extends Service {
private static final String TAG = "SocketService";
public static Socket socket;
private BufferedReader reader;
private DataOutputStream dos;
private DataInputStream in;
private boolean isConnected = false;
private SocketListener socketListener;
private SocketThread socketThread;
public interface SocketListener {
void onConnect();
void onDisconnect();
}
//定义onBinder方法所返回的对象
private MyBinder binder = new MyBinder();
public class MyBinder extends Binder
{
public DataOutputStream getOut() {
return dos;
}
public DataInputStream getIn() { return in; }
public BufferedReader getReader() {
return reader;
}
public boolean isConnected() {
if (socket != null && socket.isConnected()) {
return true;
}
return false;
}
public void disconnect() {
if (socketThread != null) {
socketThread.disconnect();
socketThread = null;
}
MyApplication myApplication = ((MyApplication)getApplicationContext());
myApplication.setbsflag(false);
Log.e(TAG, "myApplication.getbsflag():=" + myApplication.getbsflag());
}
}
//必须要实现的方法
@Override
public IBinder onBind(Intent intent) {
Log.i(TAG, "onBind方法被调用!");
isConnected();
getOut();
getIn();
getReader();
return binder;
}
//Service被创建时调用
@Override
public void onCreate() {
Log.i(TAG, "onCreate方法被调用!");
super.onCreate();
// 在这里执行绑定操作
}
//Service被启动时调用
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
super.onStartCommand(intent, flags, startId);
Log.i(TAG, "onStartCommand方法被调用!");
Bundle bd = intent.getExtras();
String ip = bd.getString("ip");
Integer port = bd.getInt("port");
connect(ip,port);
return START_STICKY;
}
//Service被关闭之前回调
@Override
public void onDestroy() {
Log.e(TAG, "onDestory方法被调用!");
super.onDestroy();
MyApplication myApplication = ((MyApplication)getApplicationContext());
if(myApplication.getbsflag() == false){
disconnect();
}
}
@Override
public void onRebind(Intent intent) {
Log.i(TAG, "onRebind方法被调用!");
super.onRebind(intent);
}
//Service断开连接时回调
@Override
public boolean onUnbind(Intent intent) {
Log.i(TAG, "onUnbind方法被调用!");
return true;
}
public boolean connect(String ip, int port) {
if (socketThread != null && socketThread.isAlive()) {
return false;
}
MyApplication myApplication = ((MyApplication)getApplicationContext());
socketThread = new SocketThread(ip, port);
socketThread.start();
if (socketThread != null && socketThread.isAlive()) {
myApplication.setbsflag(true);
}else {
myApplication.setbsflag(false);
}
return true;
}
public void disconnect() {
Log.e(TAG, "socketThread disconnect!");
if (socketThread != null) {
socketThread.disconnect();
socketThread = null;
}
}
public boolean isConnected() {
Log.e(TAG, "isConnected");
MyApplication myApplication = ((MyApplication)getApplicationContext());
if (socket != null && socket.isConnected()) {
return true;
}else {
//myApplication.setbsflag(false);
Log.e(TAG, "isConnected false:" + myApplication.getbsflag());
}
return false;
}
public DataOutputStream getOut() {
return dos;
}
public DataInputStream getIn() {
return in;
}
private class SocketThread extends Thread {
private String ip;
private int port;
public SocketThread(String ip, int port) {
this.ip = ip;
this.port = port;
}
@Override
public void run() {
try {
socket = new Socket(ip,port);
dos = new DataOutputStream(socket.getOutputStream());
in = new DataInputStream(socket.getInputStream());
isConnected = true;
if (socketListener != null) {
socketListener.onConnect();
}
} catch (IOException e) {
e.printStackTrace();
isConnected = false;
if (socketListener != null) {
socketListener.onDisconnect();
}
}
}
public void disconnect() {
Log.e(TAG, "socket disconnect!");
try {
if (socket != null) {
socket.close();
}
if (dos != null) {
dos.close();
}
isConnected = false;
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
socket连接界面实现输入ip地址和端口号连接socket服务端(APP端为客户端);
2、socket连接之后,其它界面调用SocketService以保持socket的连接,不用每个界面重新连接socket服务端,主要实现代码:
SocketService.MyBinder binder;
private ServiceConnection conn = new ServiceConnection() {
@Override
public void onServiceConnected(ComponentName componentName, IBinder iBinder) {
Log.e(TAG, "Service connected");
// 在这里处理绑定后的操作
binder = (SocketService.MyBinder) iBinder;
dos = binder.getOut();
dis = binder.getIn();
}
@Override
public void onServiceDisconnected(ComponentName componentName) {
Log.d(TAG, "Service disconnected");
// 在这里处理服务断开后的操作
}
};
//绑定服务
public void doBindService() {
it = new Intent(this, SocketService.class);
bindService(it, conn, BIND_AUTO_CREATE);
mIsState = true;
}
//解绑服务
public void doUnbindService() {
if (mIsState) {
unbindService(conn);
mIsState = false;
}
}