Основываясь на предложении из предыдущего вопроса, который я задавал здесь, я пытаюсь протолкнуть свое сокет-соединение для приложения, которое я написал в службу. Вчера я провел большую часть дня, исследуя службы, и фактически смоделировал несколько (один удаленный, один локальный).
Мой вопрос состоит из двух частей:
1) после того, как я поигрался как с локальной службой, так и с удаленное обслуживание, я все еще не уверен, какой из них лучше всего подходит для моей ситуации. Это в значительной степени связано с тем, что, как мне кажется, я до сих пор не совсем понимаю, какие преимущества дает мне работа в другом «процессе». Я создаю новый поток для подключения к сокету, несмотря ни на что, поэтому у меня не будет конфликта потоков с пользовательским интерфейсом. Так что же позволяет мне сделать включение службы в другой процесс? Увижу ли я таким образом лучшую производительность? Мое ограниченное понимание заключается в том, что если поместить его в другой процесс, служба будет работать независимо от того, какие действия я выполняю в своем приложении. У меня есть несколько разных действий, но только для одного из них требуется соединение с сокетом, которое я все равно буду перестраивать каждый раз, когда это действие открывается. Могу ли я воспользоваться локальной службой?
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));
}
};
}