2010-11-24 5 views
1

저는 Android에서 올바르게 서비스를 사용하는 방법에 대한 조언을 구하는 Android 놈입니다. TCP를 통해 데이터 스트림을 얻으려면 인터넷에있는 서버에 연결할 응용 프로그램을 만들고 있습니다. 그런 다음 데이터를 블루투스 직렬 포트를 통해 연결된 다른 장치로 보내야합니다. 사용자가 다른 활동을 보면서이 기능이 백그라운드에서 계속 작동되기를 바랍니다.Android 서비스 디자인 - 활동을 시작하거나 필요한 경우에만 시작 하시겠습니까?

이 응용 프로그램은 인터넷에서 실시간 RTK 보정 데이터를 가져 와서 블루투스를 통해 연결하는 RTK GPS 수신기로 전송하는 NTRIP 클라이언트입니다. 데이터 속도는 약 500 바이트/초입니다. 사용자 인터페이스는 데이터 스트림을 연결하거나 연결 해제하는 단일 단추이며 일부 텍스트는 GPS 수신기의 상태를 표시합니다. 또한 연결할 서버의 IP/포트 및 통신 할 블루투스 장치와 같이 사용자가 구성해야하는 몇 가지 설정이 있습니다.

로컬 서비스를 스폰하는 주 활동이 필요하다고 생각한 다음 서비스에서 TCP 스트림 용 스레드와 블루투스 연결 용 스레드를 생성해야한다고 생각합니다. 이 말이 맞습니까?

이 시나리오에서 서비스에 가장 적합한 모델은 무엇입니까?

- 작업이 시작될 때마다 서비스를 시작 (바인딩)하고 연결/연결 끊기 버튼이 서비스를 시작하고 스레드를 중지하라는 명령을 보내도록합니다. 이 경로를 선택하면 사용자가 연결을 끊고 다른 앱으로 이동 한 후에도 서비스가 계속 실행됩니다. 서비스 자체를 종료하려면 비활성 타이머가 필요합니다.

- 사용자가 연결/연결 끊기 버튼을 누르면 서비스가 시작되고 서비스가 중지됩니다. 이 서비스는 데이터가 이동할 때만 실행됩니다. 이렇게하면 액티비티가 시작될 때 액티비티가 실행 중인지 여부를 확인하여 서비스에 바인딩해야하는지 또는 링크가 연결 해제되었음을 사용자에게 알릴 필요가 있습니다.

감사합니다.

답변

1

두 번째 옵션을 사용합니다. 서비스가 실행 중인지 확인하는 것은 쉬운 작업이며 배터리 수명을 향상시키는 불필요한 처리 시간을 소비하지 않습니다.

오랫동안 백그라운드에서 서비스를 실행할 수 있다고해서 반드시 그렇게해야한다는 것은 아닙니다. 적어도 항상 그런 것은 아닙니다.

0

Android는 앱에 둘 이상의 진입 점을 지원하므로 Manifest.xml에 두 개의 진입 점을 정의 할 수 있습니다. <category android:name="android.intent.category.LAUNCHER" />은 런처에서이 클래스를 시작할 수 있음을 정의합니다. 나는 그것이 서비스를 위해 또한 일할 것이라고 생각한다. 나는 2 개의 진입 점을 할 것이다. 하나는 활동을 먼저 스폰하고 사용자에게 일부 구성 제어를 제공합니다. 그리고 단순히 서비스를 창안하는 또 다른 것.

활동의 수명을 제어 할 권한이 없으므로 시스템에서 종료해서는 안되는 모든 작업을 제안하지 않습니다. 전화가 걸려 오면 당신의 활동은 단지 죽을 것입니다. 사용자가 서비스를 시작하면 단추로 위젯을 만들 수 있습니다. 사용자가 활동을 시작하면 서비스와 위젯을 시작할 수 있습니다. 그리고 사용자가 위젯을 시작하면 사용자는 서비스에서 어떤 일이 발생해야하는지 결정합니다.

+0

부분적으로 틀리며 다른 부분은 완전히 혼동스럽고 명확하지 않을 수도 있습니다. –

0

나는 자바 또는 안드로이드 프로그래머가 아니므로, 나는 소금 한알을 가지고 말한다. Java에서 입출력을 처리하는 일반적인 방법은 스레드를 사용하는 것입니다. 데이터 흐름이 단방향 인 것처럼 들리지만 최대한의 유연성을 위해 UI 용 하나, TCP 연결 용 및 하나의 Bluetooth 연결 용으로 3 개의 스레드를 생성합니다.UI와 두 작업자 스레드 간의 통신은 공유 변수 (동기화, 경쟁 조건 등에 대해주의해야 함)를 사용하여 수행 할 수 있습니다. 다중 스레드 큐 구조를 사용하여 데이터 NTRIP 데이터를 다른 작업자에게 전달합니다.

NTRIP 데이터에 대한 작업자 스레드는 대략 다음과 같습니다 블루투스 스레드에 대한

while (app running) { 
    if (connection enabled) { 
     if (not connected) { 
     c = connect to remote 
     } 
     data = get data from c 
     queue.put(data) 
     if (options reconfigured) { 
     close c 
     } 
    } 
} 

: 정상 상태에서

while (app runnning) { 
    data = queue.get() 
    if (UI settings changed and connected) { 
     close connection 
    } 
    if (not connected) { 
     c = connect to remote 
    } 
    send data over connection 
} 

, 두 노동자는 IO에 차단하고 기본적으로 소모됩니다 CPU 시간 없음. 내 경험에 비추어 볼 때 통신 오류를 처리하기위한 코드를 작성하는 것이 좋습니다. 현실 세계에서 코드가 잘 작동하려면 클로저, 매달리기 등의 연결을 처리해야합니다. 코드를 강력하게 만드는 것은 개발에서 가장 시간이 많이 소요될 것입니다.

관련 문제