확실히 Service
을 사용하십시오. MainActivity
에서 을 사용하여 Service
에 바인딩하면 ServiceConnection
개체를 제공합니다. 이 ServiceConnection
개체에서 로컬 Messenger
개체 (replyTo
의 일부)에 대한 참조와 함께 이 나중에 사용할 수있는 Message
을 MainActivity
으로 보내면 서비스에 Message
을 보내야합니다. 이렇게하면 블루투스 스캔 결과에 따라 MainActivity
GUI를 업데이트 할 수 있습니다. 당신의 MainActivity
짧은에서
, 시작과 서비스에 바인딩 :
Intent i = new Intent(this, NetworkService.class);
startService(i);
bindService(i, networkServiceConnection, Context.BIND_AUTO_CREATE);
같은 서비스에서 메시지에 응답하는 메신저를 정의
Messenger messenger = new Messenger(new IncomingHandler());
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case NetworkService.MSG_SOMETHING:
// do something here
break;
default:
super.handleMessage(msg);
}
}
}
그리고 서비스를 쓰기 연결 코드는 다음과 같습니다 :
private ServiceConnection networkServiceConnection = new ServiceConnection() {
public void onServiceConnected(ComponentName className, IBinder service) {
networkService = new Messenger(service);
try {
Message msg = Message.obtain(null, NetworkService.MSG_REGISTER_CLIENT);
msg.replyTo = messenger;
networkService.send(msg);
log.debug("Connected to service");
} catch (RemoteException e) {
// Here, the service has crashed even before we were able to connect
}
}
replyTo
은 방금 만든 메신저입니다. 당신의 NetworkService
에서
가와 연결된 클라이언트를 추적 :
ArrayList<Messenger> clients = new ArrayList<Messenger>();
하고 핸들러를 작성 같은 : 당신이 당신의 MainActivity
다시 메시지를 보내려면 다음
class IncomingHandler extends Handler {
@Override
public void handleMessage(Message msg) {
switch (msg.what) {
case MSG_REGISTER_CLIENT:
log.debug("Adding client: " + msg.replyTo);
clients.add(msg.replyTo);
break;
default:
super.handleMessage(msg);
break;
}
}
}
, 다음과 같이하십시오 :
for (int i = 0; i < clients.size(); i++) {
try {
clients.get(i).send(Message.obtain(null, MSG_SOMETHING));
} catch (RemoteException e) {
// If we get here, the client is dead, and we should remove it from the list
log.debug("Removing client: " + clients.get(i));
clients.remove(i);
}
}