2009-05-28 2 views
5

저는 1 년 넘게 Android으로 일해 왔지만 프로세스/스레드 간의 다양한 유형의 메시징/통신을 사용해야 할 때 여전히 문제가 있습니다. 나는 주로 메시지와 소켓 통신을 보내 핸들러를 사용하여, services을 위해 AIDL을 사용하여, 방송 텐트에 대해 이야기하고있다. 이러한 도구의 대부분Android의 다양한 메시지 유형은 언제 사용해야합니까?

유사한 작업을 수행하는 데 사용하지만, 이는 특정 상황에 더 적합 할 수있다?

답변

14

이 질문은 끝내지 않은 질문이지만 내부/응용 프로그램 간의 통신이 어떻게 가장 잘 작동 하는지를 설명하는 데 사용됩니다.

Android 메시징의 핵심 요소 중 하나는 느슨하게 바인딩되는 모든 애플리케이션 구성 요소의 개념입니다. 모든 응용 프로그램이 별도의 프로세스에서 실행 한 '응용 프로그램'때문에 실제로 (다른 활동 서비스를 제공 할 책임이) 여러 응용 프로그램으로 구성 될 수있다, 메시징 기술은 모든 프로세스 경계를 ​​넘어 메시지를 마샬링의 아이디어를 기반으로하고 있습니다.

텐트는

메시징을위한 선호 기술, 항상 가능하면 인 텐트를 사용하려고합니다. Android에서 메시지를 전송하는 가장 '기본'방식입니다.

장점 메시징을위한 텐트를 사용

는 여러 응용 프로그램간에 원활하게 메시지를 전송시키는, 응용 프로그램 구성 요소의 느슨한 결합을 유지한다. 의도는 핵심 시스템 내에서 활동 및 서비스를 시작하고 시스템 이벤트를 브로드 캐스트하고 수신하기 위해 많이 사용됩니다. 이러한 구성 요소가 서로 다른 프로세스에서 실행중인 경우에도 -

사용 엑스트라 텐트 내에서 페이로드 데이터는 쉽게 다른 하나 개의 응용 프로그램 구성 요소에서 정보를 전달하는 당신이 프리미티브의 키/값 쌍을 포함 할 수 있습니다 번들입니다.

단점 텐트는 프로세스 간의 이동하도록 설계되어 있기 때문에

, 엑스트라 페이로드는 원시 유형을 지원합니다. 인 텐트를 사용하여 객체를 보내야하는 경우 한쪽 끝의 기본 요소로 분해하여 다른 쪽 끝에서 다시 구성해야합니다.

응용 프로그램 클래스

만이 편리한 솔루션을 하나의 프로세스에서 실행하는 단일 응용 프로그램 내에서 의사 소통을합니다. 저장하고 복잡한 오브젝트 데이터를 전송하는 중앙 집중화 된 장소를 제공 Application 클래스를 확장 (그리고 싱글로 구현)은 응용 프로그램 구성 요소가 존재 때마다 존재합니다 개체를 얻을으로

장점

응용 프로그램 구성 요소 사이.

단점

이 기술은 하나의 응용 프로그램 내에서 구성 요소에 메시지를 제한합니다.

서비스 바인딩, IPC 및 AIDL

이 서비스에 바인딩하면 그것으로 그 방법과 Exchange 개체에 액세스 할 수 있습니다. AIDL은 객체를 OS 프리미티브로 직렬화하여 바인딩하려는 서비스가 별도의 응용 프로그램에서 실행중인 경우 프로세스 경계를 ​​넘어서 정렬 할 수있는 방법을 정의하는 방법입니다. 당신이 서비스에 바인딩 할 때 호출 클래스 내의 객체이었다 것처럼

장점

당신은에 액세스 할 수 있습니다. 즉, 서비스에서 메소드를 실행하고 풍부한 객체를 해당 메소드와 교환 할 수 있습니다.

다른 응용 프로그램 프로세스에서 서비스에 바인딩하는 경우 Android에서 응용 프로그램간에 전달할 객체를 seralize/deserialize하는 방법을 알려주는 AIDL 정의를 만들어야합니다. 단점

IPC에 대한 AIDL 클래스를 생성

추가 작업의 비트, 그리고 바인딩은 다른 응용 프로그램이 될 때 자원을 청소하는 커널 어렵게 만들 수 있습니다 서비스 및 활동 사이에 추가 종속성을 생성 굶어 죽었다.

프로세스 경계를 ​​넘는 메시지는 비쌉니다. 따라서 서비스에서 메소드를 실행하지 않으면 바인딩과 IPC를 사용하는 것이 과잉입니다. Intent를 사용하여 동일한 작업을 수행 할 수 있는지 확인하십시오.

소켓

당신이 내 또는 단일 장치에서 실행되는 응용 프로그램 사이의 통신에 소켓에 ​​의존하는 경우, 그것의 하나가 다른 방법이 없다 또는 당신이 어딘가에 트릭을 놓친 적이 있기 때문이다. 메시지가 장치에서 나간다면 소켓은 빠르고 좋은 대안입니다. 당신이 장치에 머무르고 있다면 인 텐트가 있거나 IPC가 더 나은 선택이 될 것입니다. 그것은 모든 응용 프로그램의 사용 사례와 종류에 따라 달라집니다

http://developer.android.com/guide/appendix/faq/framework.html

+0

+1 이것은 지역 사회 전체의 표준 답변으로 사용할 수있는 이상적인 답변입니다. – aProgrammer

1

내 2 센트

  • 나는 지역 소켓을 사용하지 않았습니다. 데이터를 생성하고 파싱해야하므로 잔인한 느낌입니다.
  • 텐트는 다른 애플 리케이션이 (나를 작성 창의 또는 뭔가를 선택하는 발사 를) 머리가없는 프로세스에 GUI의 이야기를 가지고위한
  • AIDL/소포/핸들러 작업을 수행 할 수 있습니다 것을 하나 것들에 대한 것을 이 계속 실행 중입니다. 에 따라 앱 콘텐츠 제공자를 사용하여 실제 데이터를 많이 전송할 수 있지만 해당 채널의 외부로 전송해야하는 일부 데이터가있는 경향이 있습니다.
0

이것은 내가 코코아의 NSUserDefaults 클래스의 대체를 찾으려고 노력에 도움이되었다고 좋은 기사입니다.응용 프로그램이 AIDL 접근 방식을 사용하는 것이 가장 안전하기 때문에 항상 통신하는 것이 더 좋습니다. 응용 프로그램을 항상 실행하지 않아도되는 경우 브로드 캐스트 인 텐트 또는 대기중인 인 텐트 접근 방식을 사용하여 응용 프로그램간에 통신 할 수 있습니다.

관련 문제