我正在构建一个蓝牙应用程序。我想定期扫描附近的蓝牙设备。该程序应在设备启动时启动,并根据时间表(例如,每10分钟(继续查找设备。我已经在API文档中查看了"蓝牙聊天"的Android示例,我不知道为什么它从不使用"服务"类。我应该使用服务还是活动?
此外,我知道服务应该用于"长时间运行的任务",但在某些时候,我也想通过这个发现蓝牙设备的类向用户提供某种GUI通知。
那么,有人能解释一下该用哪一个吗?优点是什么?
如果您希望运行调度,则应该使用服务。因为android最终会破坏你的活动。
一定要使用Service
。在MainActivity
中,使用提供ServiceConnection
对象的bindService
绑定到Service
。在此ServiceConnection
对象中,向服务发送一个Message
,并引用本地Messenger
对象(作为replyTo
的一部分(,然后Service
可以使用该对象稍后将Message
发送回您的MainActivity
。这将使您能够根据蓝牙扫描的结果更新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>();
并创建您的处理程序,如:
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);
}
}