Как сохранить клиента android на сервере даже при изменении активности и отправить данные на сервер?

Первоначально я реализовал асинхронную задачу в своей деятельности, которая отправляет данные на сервер. Но когда я изменил действия, соединение было потеряно. Чтобы избежать этого, моим подходом было внедрение службы, которая централизует работу сети и отправляет данные на сервер, а код для этой услуги приведен ниже

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 – это моя деятельность, которую я связываю с этой службой. Ниже приведены некоторые фрагменты кода из моей деятельности.

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

Теперь, когда эта служба работает в фоновом режиме, если я хочу отправить некоторые данные на сервер, я использую следующие

  if(mBoundService!=null) { mBoundService.sendMessage("right"); } 

Solutions Collecting From Web of "Как сохранить клиента android на сервере даже при изменении активности и отправить данные на сервер?"

Код правильный. Единственная ошибка заключалась в том, что я дважды пытался запустить службу дважды в методе onServiceConnected (), а другой – в методе onCreate ().

Я изменил свой код, чтобы запустить службу только в методе onCreate () в активности запуска. Остальные действия напрямую привязаны к сервису с помощью метода doBindService ()

Когда служба привязана к Activity , она убивается, когда активность остановлена, как фоновая служба только для Activity . Следовательно, чтобы он работал, реализуйте метод onStartCommand() в своем классе Service и возвращайте this.START_STICKY . И управлять этим сервисом в этом методе.