2010-06-25 5 views
2

현재 신청서에 서비스와 활동이 있습니다.Android가 활동과 통신하기 위해 서비스를 받고 있습니까?

저는 현재 AIDL을 서비스로 사용하지 않고 활동에 서비스를 바인딩하고 활동은 동일한 애플리케이션에 있습니다.

이렇게하면 필요한 경우 내 Activity 내에서 서비스의 메서드를 호출 할 수 있지만 원하는 경우 내 Service 내에서 Activity의 메서드를 호출 할 수는 없습니다.

누구든지이 문제를 해결하는 가장 좋은 방법에 대해 의견을 말할 수 있습니까?

인 텐트를 사용할 수는 있지만 대체 옵션이 있습니까?

서비스와 활동 사이의 긴밀한 통신을 원한다. 이벤트가 발생할 때 내 서비스에서 Activity 메서드를 호출 할 수 있기를 원한다.

훌륭한 조언은 ognian에게 감사드립니다.

편집 2 :

는 지금 그러나 나는이 문제에 걸쳐 온, 그것이 내가 원하는 방식으로 작동합니다.

내 서비스가 상태 업데이트를 가져오고 내 활동이 서비스에서 보낸 업데이트에 반응해야합니다.

문제는 내 활동을 시작할 때 onBind가 호출되기 전에 전화 걸기 상태와 연결 상태를 얻고 iCallDialogActivity 인스턴스를 얻는 것입니다.

logcat의 다음 출력 결과는 더 명확 해집니다.

06-28 10:56:48.702: DEBUG/TestPhone(3498): Status: EStatusDialling 
06-28 10:56:48.751: DEBUG/TestPhone(3498): Status: EStatusConnected 
06-28 10:56:49.122: DEBUG/TestPhone(3498): Status: onBind Called <------------- 
06-28 10:56:49.141: DEBUG/TestPhone(3498): Status: iCallDialogActivity instance <------------- 
06-28 10:56:51.641: DEBUG/TestPhone(3498): Status: EStatusDisconnecting 
06-28 10:56:51.651: DEBUG/TestPhone(3498): Status: EStatusIdle 

전화 걸기 및 연결 상태 알림을받을 때 내 iCallDialogActivity를 사용할 수 있어야합니다.

하지만 내 액티비티가 시작될 때 생성되지 않기 때문에 NullPointer 예외가 발생합니다. 액티비티 onCreate()에서 바인딩이 가장 먼저 수행됩니다.

바로 바인딩 할 수있는 방법이 있습니까?

+1

서비스 코드에서 'public void setCallback (ICallDialogActivity callDialogActivity)'메서드는 실제로 콜백에 대한 서비스 글로벌 참조를 설정해야합니다. 그런 다음 서비스에서 필요할 때 사용할 수 있습니다. 또한 removeCallback() 메서드를 추가해야합니다.이 메서드는 Activity onDestroy()에서 호출합니다. 그렇지 않으면 Service가 Dead Activity를 호출 할 수 있습니다.서비스와 활동에 완전히 다른 라이프 사이클이 있기 때문에 이것을 신중하게 설계해야합니다. – ognian

+0

감사합니다. ognian, 구현했습니다. 이제해야 할 일에 대해 파악하고 있습니다. 그러나 다른 문제를 발견하고 그에 따라 게시물을 편집했습니다. 내 새로운 문제에 대한 통찰력을 가지고 있습니까? –

답변

3

활동 인스턴스에서 직접 메소드를 호출 할 수 없으므로, 서비스 메소드에서 AIDL로 호출하는 것과 동일한 IPC 메커니즘을 사용해야합니다.

먼저 콜백으로 표시 할 메소드를 선언해야합니다. 별도의 .aidl 파일에서 수행하십시오. 그런 다음 해당 콜백에 대한 설정자를 서비스의 AIDL에 추가하십시오 (예 :

void setMyCallback(inout IMyCallback myCallback); 

, IMyCallback.aidl을 만든 경우). 같은 패키지에 있어도 서비스의 .aidl에 import으로 기억하십시오. 액티비티에서 그 .aidl로부터 스텁을 인스턴스화하고 콜백하기 전에 서비스로 전달하십시오.

+0

그래서 Inter Process Communication이 필요하지 않더라도 AIDL 경로가 필요합니까? –

+1

예, 그렇기 때문에 Android가 설계되었습니다. 앱이 프로세스 전체에 걸쳐 있지 않다면 액티비티에 정적 인스턴스 게터를 몇 개 가지고 직접 사용할 수 있습니다. 나는 일할 것이지만 그것은 최선의 관행으로 간주되지 않는다. 안드로이드의 IPC는 매우 가볍기 때문에 일반적인 시나리오에서는 성능에 대해 걱정할 필요가 없습니다. – ognian

+0

멋진 튜토리얼을 가르쳐 주시겠습니까? 나는 AIDL이 Activity로부터 Service Call 메쏘드를 허용하기 위해 사용되는 곳을 찾지 못하는 것 같다. –

관련 문제