0
点赞
收藏
分享

微信扫一扫

Andriod实现Service服务保持socket长连接

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;
    }
}


举报

相关推荐

0 条评论