Wie kann man den Android-Client auch bei Aktivitätsänderungen an den Server anschließen und Daten an den Server senden?

Ich habe zunächst eine asynchrone Aufgabe in meiner Aktivität implementiert, die Daten an den Server sendet. Aber als ich die Aktivitäten wechselte, war die Verbindung verloren. Um dies zu vermeiden, war mein Ansatz, einen Service zu implementieren, der den Netzwerkbetrieb zentralisiert und Daten an den Server sendet und der Code für diesen Dienst unten angegeben ist

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 ist meine Tätigkeit, die ich an diesen Dienst binden. Im Folgenden sind einige Stücke von Code aus meiner Tätigkeit.

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

Jetzt, da dieser Service im Hintergrund läuft, wenn ich einige Daten an den Server senden möchte, benutze ich folgendes

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

  • Android Java Socket Kommunikation mit Socket.IO
  • Video-Streaming vom Android-Gerät zum LAMP Server
  • Warum bindet mein Service immer an ipv6 localhost anstelle von ipv4?
  • Nicht immer Antwort in Socket-Verbindung
  • Senden Sie mehrere Nachrichten vom TCP Server zum Client (C sharp auf Android)
  • Apache HttpClient 4.0 fehlgeschlagen für Socket auf Android
  • Android App Verbindung zu Node.js Server mit Socket.io
  • Android: Socket - java.net.SocketException: sendto fehlgeschlagen: EPIPE (Broken pipe)
  • 2 Solutions collect form web for “Wie kann man den Android-Client auch bei Aktivitätsänderungen an den Server anschließen und Daten an den Server senden?”

    Der Code ist richtig. Der einzige Fehler war, dass ich versuchte, den Service zweimal einmal in onServiceConnected () -Methode und die andere in onCreate () -Methode zu starten.

    Ich habe meinen Code geändert, um den Service nur in der onCreate () – Methode in der Launcher-Aktivität zu starten. Der Rest der Aktivitäten verbindet sich direkt mit der doBindService () – Methode an den Dienst

    Wenn ein Dienst an eine Activity gebunden ist, wird er getötet, wenn die Aktivität gestoppt wird, seine wie ein Hintergrunddienst nur für die Activity . Um es zu behalten, implementiere onStartCommand() die onStartCommand() Methode in deiner Service und this.START_STICKY . Und verwalte dich bei dieser Methode.

    Das Android ist ein Google Android Fan-Website, Alles ├╝ber Android Phones, Android Wear, Android Dev und Android Spiele Apps und so weiter.