Определенно используйте Service
.В вашем MainActivity
связывайтесь с Service
, используя bindService
, предоставляя объект ServiceConnection
.В этом ServiceConnection
объекте отправьте Message
сервису со ссылкой на локальный Messenger
объект (как часть replyTo
), который Service
может затем использовать для последующей отправки Message
назад.на ваш MainActivity
.Это позволит вам обновить MainActivity
GUI на основе результатов сканирования Bluetooth.
Короче говоря, в вашем 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>();
и создайте ваш обработчик как:
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;
}
}
}
Затем, когдаВы хотите отправить сообщение обратно на ваш MainActivity
, просто сделайте что-то вроде следующего:
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);
}
}