0

저는 블루투스 응용 프로그램을 만들고 있습니다. 주변의 블루투스 기기를 주기적으로 스캔하고 싶습니다. 이 프로그램은 장치가 시작될 때 시작되어 일정에 따라 장치를 계속 탐색합니다 (예 : 10 분마다). 나는 API 문서의 "BlueTooth Chat"안드로이드 예제를 살펴 보았으며 "Service"클래스를 사용하지 않는 이유를 알지 못합니다. 서비스 또는 활동을 사용해야합니까?활동 또는 서비스?

또한 "장기 실행 작업"을 위해 서비스가 사용되는 것으로 알고 있지만,이 클래스를 통해 사용자에게 몇 가지 종류의 GUI 알림을 제공하여 블루투스 장치를 발견하려고합니다.

그래서 누군가가 사용할 수있는 설명을 해주실 수 있습니까? 이점은 무엇입니까?

답변

3

예약을 실행하려면 서비스를 사용해야합니다. 안드로이드가 결국 귀하의 활동을 파괴 할 것이기 때문입니다.

2

확실히 Service을 사용하십시오. MainActivity에서 을 사용하여 Service에 바인딩하면 ServiceConnection 개체를 제공합니다. 이 ServiceConnection 개체에서 로컬 Messenger 개체 (replyTo의 일부)에 대한 참조와 함께 이 나중에 사용할 수있는 MessageMainActivity으로 보내면 서비스에 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); 
    } 
} 
관련 문제