내 앱에 항상 실행하고 싶은 로컬 서비스가 있습니다. 서비스가 다른 스레드를 시작하게하여 수행하고 요청에 응답하여 Handler
에 전송합니다. 서비스에 바인딩하면 백그라운드 스레드의 Handler가 반환되므로 클라이언트 작업이 요청을 발행 할 수 있습니다.Android 로컬 서비스 바인딩 및 백그라운드 스레드
지금까지 그렇게 좋았습니다.
내 응용 프로그램은 초기 상태를 설정하기 위해 서비스를 사용해야하는 Fragment
을 사용합니다. 프래그먼트가 사용자 입력에 대한 응답으로 인스턴스화되면 그 때까지 서비스가 프래그먼트의 부모 작업에 바인딩되기 때문에 괜찮습니다. 즉, ServiceConnection.onServiceConnected
이 프레임 워크에서 호출되었으며 해당 활동은 Handler
에 대해 파편이 서비스와 통신하는 데 사용할 수 있음을 알고 있습니다.
오리엔테이션 변경에 대한 응답으로 내 활동을 다시 인스턴스화 할 때 문제가 발생합니다. 이 상황에서 프레임 워크는 주 스레드의 메시지 루프 인 이전의 모든 활동 조각을ServiceConnection.onServiceConnected
이 호출되기 전에 다시 작성하여 레크리에이션에서 서비스에 액세스 할 수 없음을 나타냅니다 단계.
유일한 해결책은 서비스가 백그라운드 스레드와 관련된 응용 프로그램 전역 상태로 처리기를 게시하는 것입니다. (나는 다른 기법이 있지만 그 목적을 위해 Application
을 서브 클래 싱하고있다.) 결국 나는 그것의 'serviceness'보다는 'threadness'를 사용하고있다.
Android가 어색하고 복잡하게 만들고 싶어하는 것처럼 보이기 위해 간단하고 효과적인 방법 인 것 같습니다. 글로벌 상태에 대한 일반적인 일반적인 예약 외에도, 내 접근 방식이 간과하는 Android 관련 고려 사항이 있습니까? 또는 내가 바라는 동일한 목적을 달성하기위한 더 좋은 방법은 무엇입니까?
감사합니다. 그것은 나를 좋은 길로 인도했다. 내 배경 스레드가 reincur하고 싶지 않은 특정 초기화를 가지고 있기 때문에'IntentService'를 사용하고 싶지는 않지만,'startService (Intent)'가 아마도 필요한 것일 것입니다. 나는 이것을 충분히 고려하지 않았다. – JulianSymes
실제로 백그라운드 스레드의 핸들러에 대한 참조로 임의의 오브젝트를 전달해야하므로 실제로 작동하지 않을 것이라고 생각하며 인 텐트 메커니즘을 통해 이러한 오브젝트를 전달할 수 있다고 생각하지 않습니다. Handler에게 보내는 메시지에 이들을 넣어야합니다. – JulianSymes
내가 틀렸다고 정정하되, 전달하려고하는 객체를 Parcelable 인터페이스를 구현하도록 만들 수 없습니까? 이렇게하면 이러한 객체를 마샬링/언 마샬링하고 IntentService에서 새로 생성 된 Thread에 전달할 수 있습니다. 이 작업을 수행하는 방법에 대한 링크를 살펴보십시오. http://android-er.blogspot.com/2013/03/example-to-implement-parcelable.html – Emmanuel