How to keep the android client connected to the server even on activity changes and send data to server?
android, asyncsocket, client-server, sockets
Solution
The code is right. The only mistake was that I was trying to start the service twice once in onServiceConnected() method and the other in onCreate() method.
I changed my code to start the service only in onCreate() method in the launcher activity. The rest of the activities directly bind to the service by using doBindService() method
Problem
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 ``` 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 && !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; } } ``` Rotator.java is my activity which I bind to this service. Following are few pieces of code from my activity. ``` 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(); } ``` Now as this service runs in the background, If i want to send some data to the server i use the following ``` if(mBoundService!=null) { mBoundService.sendMessage("right"); } ```