2016-06-13 4 views
1

상황의 두 서비스 간 통신 :안드로이드 : 두 개의 분리 된 APK

나는 모든 시간을 실행 예상되는 Service와 (지속) 안드로이드 시스템 응용 프로그램이 있습니다. (서비스 A라고합시다)

Service을 가진 또 다른 응용 프로그램 (시스템 응용 프로그램이 아닌 일반 응용 프로그램)이 있습니다. 그러나이 Service은 리소스가 필요할 경우 안드로이드 OS가 죽이기 때문에 실행되거나 실행되지 않을 수 있습니다.

간략한 요약하면 동일한 인증서로 서명 할 수있는 두 개의 응용 프로그램 (따라서 2 개의 APK)이 있습니다. (그래서 그들은 동일한 프로세스 오른쪽에서 실행할 수?)

내가 본 서비스 A는 이벤트를 수신

를 달성하려고 무엇. 그 다음 이벤트를 받았을 때 나는 서비스 A가 다시 서비스 A.에 내가 할 수있는이 개 서비스는

을 통신 할 수 있도록하는

접근을 응답을 제공해야 정상적인 앱 (서비스 B)를 호출 할 그들을 사용하여 통신 :

(복잡한 객체를 전달하는 것이 필수이기 때문에 최적이 아닌)
  • 메시징 (AN AIDL을 사용하여) 바인딩

    문제

      의사 소통 방법
    • 이 설명 된 경우에 "최고"하나?
    • 서비스 A가 서비스 B에 메시지를 위임/전송하고 서비스 B가 실행되고 있지 않으면 어떻게됩니까? 서비스 B에서 응답을 받아야합니다. 서비스 A가 서비스를 호출하려고 할 때 실행 중이 아니면 항상 서비스 B를 시작해야합니까?

    고맙습니다!

  • +0

    로부터 응답을 원하기 때문에 좋은 옵션이 될 것입니다 [이] (http://stackoverflow.com/a/33688843/2252830) – pskink

    답변

    2

    어떤 통신 방법이 설명 된 경우에 가장 적합한 것입니까?

    "Aidl"과 "Binding"이 같은 것이므로 두 가지 옵션 만 언급합니다. AIDL을 사용하여 프로세스 간 서비스 바인딩을위한 클라이언트 측 프록시와 서버 측 스텁을 설명하고 구현합니다.

    전화 및 응답을 원한다면 바인딩이 더 나은 선택 일 수 있습니다. 그렇지만 Parcelable, Serializable을 사용하지 않거나 JSON 또는 다른 것으로 개체 그래프를 변환하는 것 외에는 "복잡한 개체"를 잘 지원하는 IPC 방식이 없다는 점에 유의하십시오.

    서비스 A가 서비스 B에 메시지를 위임/보내려하고 서비스 B가 실행되고 있지 않으면 어떻게됩니까?

    당신이 startService() 또는 bindService() 전화

    는 안드로이드 포크 앱 B의 과정 및 방법 (그 onCreate()를 호출) 서비스의 인스턴스를 만듭니다. 이 시점에서 프로세스와 서비스가 이미 실행중인 것처럼 동작이 동일합니다.

    +0

    유익한 답변을 보내 주셔서 감사합니다. 따라서 서비스를 바인딩하고 AIDL을 사용하여 API를 설명합니다. – sjkm

    +0

    @sjkm : 예. 일반 메소드 호출과 같이 동기식 응답을 원할 경우 AIDL 인터페이스에 메소드의 리턴 값을 정의하게하십시오. 비동기 응답을 원할 경우 서비스 B와 A에서 전달할 콜백 객체 모두에 대해 AIDL을 정의한 다음 AIDL 정의 메서드에서 콜백 객체의 인스턴스를 전달하고 B가이를 사용하여 메서드를 호출 할 수 있습니다 A의 콜백에서 비동기 결과를 제공합니다. 콜백 방식의 예는 [이 샘플 앱] (https://github.com/commonsguy/cw-omnibus/tree/master/Binding/Callback)을 참조하십시오. – CommonsWare

    +0

    고마워요! 잘됐다. 나는 내일 그것을 더 깊이 볼 것이다. 좋은 저녁 되세요. – sjkm

    0

    서비스 A를 포함하는 응용 프로그램이 시스템 응용 프로그램 인 경우이 두 응용 프로그램을 동일한 인증서로 어떻게 서명 할 수 있습니까?

    플랫폼 인증서에 액세스 할 수 있습니까?

    어쨌든 AIDL 당신이 빠르고 복잡한 데이터 참조를 전달하려는 경우 서비스 B.

    +0

    플랫폼 인증서를 시스템 애플리케이션으로 사용하려면 앱에 서명 할 필요가 없습니다. 그냥 "/ system/app"/ "system/priv-app"폴더에 설치해야합니다 ... – sjkm

    관련 문제