Деятельность или Сервис? - PullRequest
0 голосов
/ 06 июля 2011

Я создаю приложение Bluetooth. Я хочу периодически сканировать близлежащие устройства Bluetooth. Эта программа должна запускаться при запуске устройства и продолжать обнаружение устройств по расписанию (например, каждые 10 минут). Я просматривал пример Android "BlueTooth Chat" в документации API, и я не знаю, почему он никогда не использует класс "Service". Должен ли я использовать сервис или деятельность?

Кроме того, я понимаю, что Службы должны использоваться для «длительных задач», но я также в какой-то момент хочу предоставить пользователям своего рода GUI-уведомление через этот класс, которое обнаруживает устройства Bluetooth.

Итак, кто-то может объяснить, какой из них использовать? В чем преимущество?

Ответы [ 2 ]

3 голосов
/ 06 июля 2011

Вам следует использовать сервис, если вы хотите, чтобы ваше расписание работало. Потому что Android в конечном итоге уничтожит вашу активность.

2 голосов
/ 06 июля 2011

Определенно используйте 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);
    }
}
...