活动或服务?

时间:2011-07-06 04:33:47

标签: android user-interface service android-activity bluetooth

我正在构建蓝牙应用程序。我想定期扫描附近的蓝牙设备。该程序应在设备启动时启动,并根据计划继续发现设备(例如每10分钟)。我一直在查看API文档中的“蓝牙聊天”的Android示例,我不知道为什么它从不使用“服务”类。我应该使用服务还是活动?

此外,我了解服务应该用于“长时间运行的任务”,但我也希望通过这个发现蓝牙设备的类向用户提供某种GUI通知。

那么,有人可以解释一下要使用哪一个?有什么好处?

2 个答案:

答案 0 :(得分:3)

如果你想让你的日程安排运行,你应该使用服务。因为android最终会破坏你的活动。

答案 1 :(得分:2)

绝对使用Service。在MainActivity使用提供Service对象的bindServiceServiceConnection绑定。在此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);
    }
}