2011-02-03 3 views
1

좋아, 그래서 나는 활동 (UI)와 서비스 (배경 폴링)와 안드로이드 애플 리케이션을 가지고. 두 가지는 AIDL (콜백을 포함하여 이중 통신, IPC 등)을 사용하여 복잡하게 연결되어 있습니다.AIDL - 중요한 점은 무엇입니까?

언제든지 두 가지 대화를 사용하고 있습니다.

그러나 나는 또한 Application 클래스를 확장하여 두 클래스가 공통 데이터 객체를 공유 할 수 있도록했습니다. 따라서 응용 프로그램은 서비스가 항상 사용하는 사용자 객체를 보유하고 있으며 액티비티는 실행 중일 때 액티비티에 액세스 할 수 있습니다.

사용자가 UI 업데이트를 트리거하기 때문에 상황에 따른 누출을 방지하기 위해 활동에 약점이 있습니다. 나는 그래서 나는 그것을 얻지 않는다

_app = (FooApplication)this.getApplication(); 
FooActivity uiRef = _app.getUIReference().get(); 
if (uiRef != null) { 
    uiRef.updateSomeDisplay(); 
} 

를 수행하여 서비스 내에서 UI 이벤트를 트리거 할 수

Activity (UI) ---> Application <--- Service

처럼

그래서 그것은 본다. UI를 약하게 참조하고, 존재하는지 확인하고, 메소드를 호출 할 때 복잡한 AIDL 호출을 사용하는 것은 왜 까닭입니다.

답변

0

AIDL의 요점은 프로세스 간 통신을 허용하는 것입니다. 서비스의 요점은 백그라운드 작업이 UI 스레드와 별도의 프로세스에서 실행되도록 허용하여 응용 프로그램을 닫더라도 실행을 계속할 수있게하는 것입니다. 서비스는 UI와 완전히 다른 프로세스에서 실행되므로 AIDL이 필요하므로 서비스 프로세스에서 UI 프로세스의 메모리에 액세스 할 수 없습니다.

+0

나는 본다. 나는이 같은 생각을 함께 엮어서 자신을 편집하기 위해 돌아 왔었다. 별도의 프로세스가있는 경우 - 독립 실행 형 서비스 프로세스가 고급 작업 킬러에 표시되지 않습니까? 그것은 목록 활동으로 제한됩니까? – paulpooch

+0

필자는 작년 안드로이드 2.1부터 4.1.2까지의 모든 종류의 장치에서 여러 응용 프로그램의 백그라운드 서비스로 작업 해 왔으며 같은 환경에서 정의 된 사용자 인터페이스와는 별도의 프로세스에서 서비스를 실행하는 것을 한번도 보지 못했습니다. APK 파일. 설명서에 "응용 프로그램 구성 요소가 시작되고 해당 응용 프로그램의 프로세스가 이미 존재하기 때문에 (응용 프로그램의 다른 구성 요소가 있으므로) 프로세스 내에서 구성 요소가 시작되고 동일한 실행 스레드가 사용됩니다." 예, 당신은 할 수 있습니다 * 이것을 할 수는 없지만 당신이 왜 ... – Jules

+0

왜 이렇게하고 싶은지에 대한 한 가지 예는 백그라운드 오디오 서비스를위한 것입니다. 플레이어를 별도의 프로세스로 실행하게되면 오디오 재생 중 전체 UI 스택이 메모리에 남아 있지 않아도되므로 미디어 플레이어 앱의 메모리 효율이 향상 될 수 있습니다. 그러나, 그것은 AIDL을 사용하기 위해 일을 상당히 복잡하게 만듭니다. 따라서 대부분의 경우, 그럴 가치가 없습니다. –