title: How to keep the android client connected to the server even on activity changes and send data to server?
body: <p>I initially implemented an async task in my activity which sends data to the server. But when i changed activities the connection was lost. To avoid this my approach was to implement a service that centralizes the network operation and sends data to the server and the code for this service is given below</p>
  
  <pre><code>import java.io.BufferedWriter;
  import java.io.OutputStreamWriter;
  import java.io.PrintWriter;
  import java.net.InetAddress;
  import java.net.Socket;
  
  import android.app.Service;
  import android.content.Intent;
  import android.os.Binder;
  import android.os.IBinder;
  import android.util.Log;
  import android.widget.Toast;
  
  public class SocketService extends Service {
    public static final String SERVERIP = ""; //your computer IP address should be written here
    public static final int SERVERPORT = 5000;
    PrintWriter out;
    Socket socket;
    InetAddress serverAddr;
  
  @Override
  public IBinder onBind(Intent intent) {
      // TODO Auto-generated method stub
      System.out.println("I am in Ibinder onBind method");
        return myBinder;
  }
  
    private final IBinder myBinder = new LocalBinder();
    TCPClient mTcpClient = new TCPClient();
  
    public class LocalBinder extends Binder {
          public SocketService getService() {
              System.out.println("I am in Localbinder ");
              return SocketService.this;
  
          }
      }
  
    @Override
      public void onCreate() {
          super.onCreate();
          System.out.println("I am in on create");     
      }
  
    public void IsBoundable(){
          Toast.makeText(this,"I bind like butter", Toast.LENGTH_LONG).show();
      }
  
    public void sendMessage(String message){
          if (out != null &amp;&amp; !out.checkError()) {
              System.out.println("in sendMessage"+message);
              out.println(message);
              out.flush();
          }
      }
  
      @Override
      public int onStartCommand(Intent intent,int flags, int startId){
          super.onStartCommand(intent, flags, startId);
          System.out.println("I am in on start");
        //  Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show();
          Runnable connect = new connectSocket();
          new Thread(connect).start();
          return START_STICKY;
      }
  
  
      class connectSocket implements Runnable {
  
          @Override
          public void run() {
  
  
              try { 
                   //here you must put your computer's IP address.
                  serverAddr = InetAddress.getByName(SERVERIP);
                  Log.e("TCP Client", "C: Connecting...");
                  //create a socket to make the connection with the server
  
                  socket = new Socket(serverAddr, SERVERPORT);
  
                   try {
  
  
                       //send the message to the server
                       out = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
  
  
                       Log.e("TCP Client", "C: Sent.");
  
                       Log.e("TCP Client", "C: Done.");
  
  
                      } 
                   catch (Exception e) {
  
                       Log.e("TCP", "S: Error", e);
  
                   }
              } catch (Exception e) {
  
                  Log.e("TCP", "C: Error", e);
  
              }
  
          }
  
      }
  
  
      @Override
      public void onDestroy() {
          super.onDestroy();
            try {
                socket.close();
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            socket = null;
        }
  
  
      }
  </code></pre>
  
  <p>Rotator.java is my activity which I bind to this service. Following are few pieces of code from my activity. </p>
  
  <pre><code>private ServiceConnection mConnection = new ServiceConnection() {
              //EDITED PART
      @Override
      public void onServiceConnected(ComponentName name, IBinder service) {
          // TODO Auto-generated method stub
           mBoundService = ((SocketService.LocalBinder)service).getService();
  
      }
  
      @Override
      public void onServiceDisconnected(ComponentName name) {
          // TODO Auto-generated method stub
           mBoundService = null;
      }
  
    };
  
  
     private void doBindService() {
         bindService(new Intent(Rotator.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE);
         mIsBound = true;
         if(mBoundService!=null){
         mBoundService.IsBoundable();
         }
     }
  
  
     private void doUnbindService() {
         if (mIsBound) {
             // Detach our existing connection.
             unbindService(mConnection);
             mIsBound = false;
         }
     }
  
  @Override
  public void onCreate(Bundle savedInstanceState)
  {
        super.onCreate(savedInstanceState);
        gestureDetector = new GestureDetector(this, new GestureListener());
        setContentView(R.layout.activity_rotator);
  
  
        //Binding the activity to the service to perform client-server operations
        //start service on create
          startService(new Intent(Rotator.this,SocketService.class));
          doBindService();
                    ...........
                    ...........
  }   
  
  
  @Override
  protected void onDestroy() {
      super.onDestroy();
      doUnbindService();
  }
  </code></pre>
  
  <p>Now as this service runs in the background, If i want to send some data to the server i use the following</p>
  
  <pre><code> if(mBoundService!=null)
  {
      mBoundService.sendMessage("right");
  }
  </code></pre>