2012-05-07 2 views
6

Android에서 서로 다른 두 프로세스 (서비스 및 활동) 간의 통신을 관리 할 수 ​​있습니다. via Messenger or AIDL : 활동이 서비스에 바인딩되면 충분합니다.서비스와 활동 (및 그 하위 활동) 간의 IPC를 처리하는 방법은 무엇입니까?

그러나이 활동에 하나 이상의 하위 활동이있는 경우 어떻게됩니까? 주요 활동이 하위 활동을 시작하는 순간부터 의사 소통 활동으로 방향을 바꾼다. 하위 활동이 파괴 될 때 마찬가지로, 나는 통신이 다시 주요 활동에 리디렉션하려는 등

예 # 1 :

  1. 이면 MyService < --- IPC ---> MainActivity
  2. MainActivity는 하위 활동 후이면 MyService
  3. 하위 활동이 파괴 < --- IPC ---> 하위 활동, 다음이면 MyService < --- IPC ---> MainActivity를 시작

예 2 :

  1. 이면 MyService
  2. MainActivity가 FirstSubActivity를 시작 < --- IPC ---> MainActivity, 다음이면 MyService < --- IPC ---> FirstSubActivity는
  3. FirstSubActivity는, SecondSubActivity을 시작합니다 이면 MyService < --- IPC ---> SecondSubActivity
  4. SecondSubActivity가 파괴되고, 다음이면 MyService < --- IPC ---> FirstSubActivity
  5. FirstSubActivity가 파괴되고, 다음 MyServi ce < --- IPC ---> MainActivity

어떻게 처리합니까?

답변

5

서비스에 바인딩하고 연결을 유지하는 단일 엔터티를 갖고 싶습니다. 해당 엔티티가 Activity 인스턴스가 아니어야합니다. 이 시도 :

  • 응용 프로그램 및 BaseActivity의 방법을 사용하여 서비스 사이의 연결을 관리
  • BaseActivity
  • 에서의 모든 활동을 유도 활동을 서브 클래스의 기본 클래스 (BaseActivity)를 만듭니다. BaseActivity는 서비스에 대한 연결을 추적하고 서비스에 대한 바인딩을 처리하고 종료 할 때 서비스를 종료하는 정적 (클래스) 변수를 가져야합니다.
  • 서비스에 바인딩 할 때 응용 프로그램 컨텍스트 (활동 컨텍스트가 아님)를 사용하여 활동이 파괴 될 때 OS가 서비스에 대한 연결을 종료하지 않도록하십시오.

이렇게하면 다양한 활동과 서비스 간의 연결을 생성하고 해체하는 것에 대해 걱정할 필요가 없습니다. 전체 응용 프로그램 (모든 활동)과 서비스 사이에는 오직 하나의 연결 만 있습니다.

내가 모든 피투성이의 세부 사항을 설명하지 않았지만, 기본 아이디어를 얻었기를 바랍니다.

1

다음 해결책에 대해 생각해 본 적이 있습니까? Activity to Service를 바인딩하는 대신 startService() 명령을 사용하여 활동을 시작한 다음 Intents 및 Receivers와 통신 할 수 있습니다. 이렇게하면 다른 상태로 서비스를 호출하고 원하는 국가와 상호 작용할 수 있습니다.

+0

[sendBroadcast] (http://developer.android.com/reference/android/content/Context.html#sendBroadcast%28android.content.Intent%29)에 대한 설명서에 따르면 수신기 및 수신기에서 결과가 전파되지 않습니다. 방송을 중단 할 수 없습니다. _ – enzom83

+0

사실입니다. 그러나 당신의 예에서 나는 당신이 서비스와 활동 사이의 의사 소통에 하이라이트를 넣었다는 것을 보았습니다. 이전에 설명한 메커니즘은 간단하며 수신기 및 브로드 캐스트 인 텐트를 올바르게 사용하면 문제를 해결할 수 있습니다. (내 견해로는) –

+0

물론, 나는 서비스의 의도를 수신하기 위해 액티비티의 브로드 캐스트 리시버를 사용할 수 있고, 액티비티의 의도를 수신하려면 서비스의 다른 브로드 캐스트 리시버를 사용할 수있다. 그러나 브로드 캐스트로 메시지를 보내면 특정 패키지에서만 수신 할 수 없으므로 4 이전 버전에서는 지원되지 않으므로 [_ 대체로 ICE_CREAM_SANDWICH로 시작하여 안전하게 Intent.setPackage_] (http://developer.android.com/reference/android/content/BroadcastReceiver.html)를 사용하여 단일 응용 프로그램으로 브로드 캐스트합니다. – enzom83