TCP套接字的Android服务

Kyl*_*yle 5 sockets service android

基于我在此问过的上一个问题中的建议,我正在尝试将我的套接字连接推送到我已写入服务的应用程序中.昨天我花了大部分时间来研究服务,并且实际上嘲笑了一些(一个远程,一个本地).

我的问题分为两部分:

1)在玩过本地服务和远程服务之后,我仍然不确定哪一个最符合我的情况.这在很大程度上是因为我想我仍然不太明白在另一个"过程"中运行的优势会给我什么.我正在为套接字连接生成一个新线程,无论如何我都不会与UI有任何线程争用.那么将服务放在另一个流程中能让我做到什么呢?我可能会以这种方式看到更好的表现吗?我有限的理解是,通过将其置于不同的过程中,该服务将独立于我在我的应用程序上运行的任何活动而运行.我确实有一些不同的活动,但只有其中一个需要套接字连接,无论如何每次打开活动时我都会重建.

2)我将在我的服务中为我从服务器传递的任何新数据中的套接字"监听器"(DataInputStream().readLine()).在我昨天玩的游戏之后,我无法弄清楚如何在"实时"中将它读取的数据传递给实际的"客户端"(由远程服务绑定客户端,或本地客户端本身).

非常感谢第1部分的一些建议,以及第2部分的一些帮助(代码示例?:))

TIA

编辑:添加了我的服务代码 - 使用本地服务

服务类别:

   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;
    }
}
Run Code Online (Sandbox Code Playgroud)

调用服务的活动:

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));
            }               
          };
}
Run Code Online (Sandbox Code Playgroud)

Com*_*are 8

这在很大程度上是因为我想我仍然不太明白在另一个"过程"中运行的优势会给我什么.

一般来说,没有.如果您希望其他应用程序与服务通信,则可以创建远程服务.如果它仅由您自己的应用程序使用,请使用本地服务.

此外,远程服务与在应用程序中创建单独的进程无关.

我可能会以这种方式看到更好的表现吗?

由于额外的内存消耗,你会看到更差的性能.

我有限的理解是,通过将其置于不同的过程中,该服务将独立于我在我的应用程序上运行的任何活动而运行.

无论是本地还是远程,服务都具有独立于活动的生命周期.

那么本地服务是否适合我?

听起来很可能.

在我昨天玩的游戏之后,我无法弄清楚如何在"实时"中将它读取的数据传递给实际的"客户端"(由远程服务绑定客户端,或本地客户端本身).

使用本地绑定模式,并让活动在服务上调用API以注册(和取消注册)事件侦听器.让服务通过监听器将数据传递给活动.