Android-Dienst für TCP-Sockets

Auf der Grundlage eines Vorschlags in einer früheren Frage, die ich hier gestellt habe, versuche ich, meine Socket-Verbindung für eine Anwendung zu pushen, die ich in einen Dienst geschrieben habe. Ich habe gestern den größten Teil des Tages damit verbracht, nach Dienstleistungen zu suchen, und ein paar (eine entfernte, eine lokale) verspottet.

Meine Frage besteht aus zwei Teilen:

1) Nachdem ich sowohl mit einem lokalen als auch einem Remote-Dienst gespielt habe, bin ich mir immer noch nicht sicher, welcher für meine Situation am besten geeignet ist. Dies liegt zu einem großen Teil an der Tatsache, dass ich immer noch nicht ganz verstehe, welche Vorteile es für mich haben wird, in einem anderen „Prozess“ zu laufen. Ich spawne einen neuen Thread für die Socket-Verbindung, egal was passiert, so dass ich keine Thread-Konflikte mit der Benutzeroberfläche habe. Was kann ich tun, wenn ich den Service in einen anderen Prozess einbaue? Kann ich auf diese Weise möglicherweise eine bessere Leistung erzielen? Mein begrenztes Verständnis ist, dass der Dienst in einem anderen Prozess ausgeführt wird, unabhängig von der Aktivität, die ich auf meiner App ausgeführt habe. Ich habe einige verschiedene Aktivitäten, aber nur eine davon erfordert die Socket-Verbindung, die ich jedes Mal neu aufbauen werde, wenn diese Aktivität trotzdem geöffnet wird. Wäre ein lokaler Service der richtige Weg für mich?

2) Ich werde meinen Socket "Listener" (DataInputStream (). ReadLine () in einer while-Schleife) in meinem Dienst für alle neuen Daten haben, die vom Server weitergeleitet werden. Nach dem gestrigen Spiel konnte ich nicht herausfinden, wie die gelesenen Daten in "Echtzeit" an den tatsächlichen "Client" (entweder durch Remote-Service gebundener Client oder lokaler Client selbst) übergeben werden.

Wäre sehr dankbar für einige Vorschläge für Teil 1 und einige Hilfe für Teil 2 (Codebeispiele?:))

TIA

Edit: Code meines Dienstes hinzugefügt - passend zum lokalen Dienst

Service-Klasse:

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

Aktivität, die den Service aufruft:

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

Antworten auf die Frage(2)

Ihre Antwort auf die Frage