Servicio de Android para sockets TCP

Sobre la base de una sugerencia en una pregunta anterior que pregunté aquí, estoy tratando de empujar mi conexión de socket para una aplicación que he escrito en un servicio. Pasé la mayor parte del día ayer buscando servicios y en realidad me burlé de unos pocos (uno remoto, uno local).

Mi pregunta está dividida en dos partes:

1) después de haber jugado con un servicio local y un servicio remoto, todavía no estoy seguro de cuál sería el mejor para mi situación. Esto se debe en gran parte al hecho de que supongo que todavía no entiendo qué ventajas que se ejecutan en otro "proceso" va a darme. Estoy generando un nuevo hilo para la conexión de socket no importa lo que por lo que no tendrá ninguna discusión de hilo con la interfaz de usuario. Entonces, ¿qué me permite hacer el servicio en otro proceso? ¿Puedo ver un mejor rendimiento de esa manera? Mi entendimiento limitado es que al ponerlo en un proceso diferente, el servicio funcionará independientemente de cualquier actividad que tenga en mi aplicación. Tengo algunas actividades diferentes, pero solamente una de ellas requiere la conexión del zócalo que reconstruiré cada vez que la actividad se abre de todos modos. Así que un servicio local ser el camino a seguir para mí?

2) voy a tener mi socket "listener" (DataInputStream (). ReadLine () dentro de un bucle while) dentro de mi servicio para cualquier nuevo dato que se transmite desde el servidor. Después de la jugada que hice ayer, no pude averiguar cómo pasar los datos que se leen al "cliente" real (ya sea cliente enlazado por servicio remoto, o cliente local en sí) en "tiempo real".

Agradecería mucho algunas sugerencias para la parte 1, y alguna ayuda con la parte 2 (ejemplos de código? :))

TIA

Editar: código añadido de mi servicio – ir con servicio local

Clase de servicio:

public class SocketService extends Service { Socket s; PrintStream os; @Override public IBinder onBind(Intent arg0) { // TODO Auto-generated method stub return myBinder; } private final IBinder myBinder = new LocalBinder(); public class LocalBinder extends Binder { public SocketService getService() { return SocketService.this; } } @Override public void onCreate() { super.onCreate(); s = new Socket(); } public void IsBoundable(){ Toast.makeText(this,"I bind like butter", Toast.LENGTH_LONG).show(); } public void onStart(Intent intent, int startId){ super.onStart(intent, startId); Toast.makeText(this,"Service created ...", Toast.LENGTH_LONG).show(); Runnable connect = new connectSocket(); new Thread(connect).start(); } class connectSocket implements Runnable { @Override public void run() { SocketAddress socketAddress = new InetSocketAddress("192.168.1.104", 4505); try { s.connect(socketAddress); } catch (IOException e) { e.printStackTrace(); } } } @Override public void onDestroy() { super.onDestroy(); try { s.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } s = null; } } 

Actividad que llama servicio:

 public class SocketServiceController extends Activity { private SocketService mBoundService; private Boolean mIsBound; public SocketServiceController ssc; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); ssc = this; setContentView(R.layout.main); Button start = (Button)findViewById(R.id.serviceButton); Button stop = (Button)findViewById(R.id.cancelButton); start.setOnClickListener(startListener); stop.setOnClickListener(stopListener); } private ServiceConnection mConnection = new ServiceConnection() { public void onServiceConnected(ComponentName className, IBinder service) { mBoundService = ((SocketService.LocalBinder)service).getService(); } public void onServiceDisconnected(ComponentName className) { mBoundService = null; } }; private void doBindService() { bindService(new Intent(SocketServiceController.this, SocketService.class), mConnection, Context.BIND_AUTO_CREATE); mIsBound = true; mBoundService.IsBoundable(); } private void doUnbindService() { if (mIsBound) { // Detach our existing connection. unbindService(mConnection); mIsBound = false; } } @Override protected void onDestroy() { super.onDestroy(); doUnbindService(); } private OnClickListener startListener = new OnClickListener() { public void onClick(View v){ startService(new Intent(SocketServiceController.this,SocketService.class)); doBindService(); } }; private OnClickListener stopListener = new OnClickListener() { public void onClick(View v){ stopService(new Intent(SocketServiceController.this,SocketService.class)); } }; } 

Esto se debe en gran parte al hecho de que supongo que todavía no entiendo qué ventajas que se ejecutan en otro "proceso" va a darme.

Generalmente, ninguno. Crea un servicio remoto si espera que otras aplicaciones se comuniquen con el servicio. Si sólo va a ser utilizado por su propia aplicación, utilice un servicio local.

Además, un servicio remoto no tiene nada que ver con la creación de un proceso independiente dentro de su aplicación.

¿Puedo ver un mejor rendimiento de esa manera?

Usted verá un rendimiento peor de esa manera, debido al consumo extra de memoria.

Mi entendimiento limitado es que al ponerlo en un proceso diferente, el servicio funcionará independientemente de cualquier actividad que tenga en mi aplicación.

Los servicios tienen un ciclo de vida independiente de las actividades, independientemente de si es local o remoto.

Así que un servicio local ser el camino a seguir para mí?

Suena probable.

Después de la jugada que hice ayer, no pude averiguar cómo pasar los datos que se leen al "cliente" real (ya sea cliente enlazado por servicio remoto, o cliente local en sí) en "tiempo real".

Utilice el patrón de enlace local y haga que la actividad llame a una API en el servicio para registrar (y anular el registro) un detector de eventos. Haga que el servicio pase los datos a la actividad a través del oyente.

  • El arranque del emulador atascó la estructura x86 en AOSP 4.3 con el emulador: Error al conectar con el zócalo '127.0.0.1:1970'
  • Android: ¿Cómo detectar la aplicación eliminada de la lista de aplicaciones recientes?
  • Socket Connection Timeout en el teléfono Android
  • Socket Android excepción "socket está cerrado"
  • Tiempo de espera de conexión de socket Android
  • Recibe UDP en Android Marshmallow
  • No obtiene respuesta en la conexión de socket
  • DatagramSocket.bind (); Socket excepción: no se puede asignar la dirección solicitada. Emulador de Android
  • InputStream no recibe EOF
  • Android juego multi-jugador a través de la red
  • Androide, socket, programación, atrás, router
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.