저는 1 년 넘게 Android
으로 일해 왔지만 프로세스/스레드 간의 다양한 유형의 메시징/통신을 사용해야 할 때 여전히 문제가 있습니다. 나는 주로 메시지와 소켓 통신을 보내 핸들러를 사용하여, services
을 위해 AIDL을 사용하여, 방송 텐트에 대해 이야기하고있다. 이러한 도구의 대부분Android의 다양한 메시지 유형은 언제 사용해야합니까?
유사한 작업을 수행하는 데 사용하지만, 이는 특정 상황에 더 적합 할 수있다?
저는 1 년 넘게 Android
으로 일해 왔지만 프로세스/스레드 간의 다양한 유형의 메시징/통신을 사용해야 할 때 여전히 문제가 있습니다. 나는 주로 메시지와 소켓 통신을 보내 핸들러를 사용하여, services
을 위해 AIDL을 사용하여, 방송 텐트에 대해 이야기하고있다. 이러한 도구의 대부분Android의 다양한 메시지 유형은 언제 사용해야합니까?
유사한 작업을 수행하는 데 사용하지만, 이는 특정 상황에 더 적합 할 수있다?
이 질문은 끝내지 않은 질문이지만 내부/응용 프로그램 간의 통신이 어떻게 가장 잘 작동 하는지를 설명하는 데 사용됩니다.
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
내 2 센트
이것은 내가 코코아의 NSUserDefaults 클래스의 대체를 찾으려고 노력에 도움이되었다고 좋은 기사입니다.응용 프로그램이 AIDL 접근 방식을 사용하는 것이 가장 안전하기 때문에 항상 통신하는 것이 더 좋습니다. 응용 프로그램을 항상 실행하지 않아도되는 경우 브로드 캐스트 인 텐트 또는 대기중인 인 텐트 접근 방식을 사용하여 응용 프로그램간에 통신 할 수 있습니다.
:
+1 이것은 지역 사회 전체의 표준 답변으로 사용할 수있는 이상적인 답변입니다. – aProgrammer