根据我在这里提出的上一个问题中的建议,我正在尝试为我已写入服务的应用程序推送套接字连接。昨天我花了一天的大部分时间研究服务,实际上模拟了一些服务(一个是远程的,一个是本地的)。
我的问题分为两部分:
1)在使用了本地服务和远程服务之后,我仍然不确定哪一个最适合我的情况。这在很大程度上是因为我想我仍然不太明白在另一个“进程”中运行会给我带来什么优势。无论如何,我都会为套接字连接生成一个新线程,因此我不会与 UI 发生任何线程争用。那么,将服务放入另一个进程中可以让我做什么呢?这样我可能会看到更好的性能吗?我有限的理解是,通过将其放入不同的进程中,该服务将独立于我在应用程序上运行的任何活动运行。我确实有一些不同的活动,但只有其中一个需要套接字连接,无论如何,每次打开该活动时我都会重建该连接。那么本地服务适合我吗?
2)我将在我的服务中设置我的套接字“侦听器”(DataInputStream().readLine() 在 while 循环内),以接收从服务器传递下来的任何新数据。在我昨天玩完之后,我不知道如何将它读取的数据“实时”传递给实际的“客户端”(远程服务绑定的客户端,或本地客户端本身)。
非常感谢对第 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;
}
}
调用服务的活动:
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));
}
};
}