2016-08-12 1 views
3

메인 액티브 (MainService)라는 서비스를 시작하는 MainActivity라는 액티비티가 있습니다. 또한 MainActivity가 MainService 내의 메소드 및 public 변수에 액세스 할 수 있도록 Service를 바인드합니다. 다른 방법으로 할 수 있습니까? 즉, 서비스가 활동의 방법에 액세스 할 수 있습니까?서비스가 활동 내에서 변수에 액세스 할 수 있습니까?

onResume()에 설정된 MainActivity에 변수가 있고 처음 시작할 때 onResume()이 실행될 때까지 서비스가 아직 시작되지 않았으므로이 시점에서이 메서드를 구현하고 싶습니다. 서비스는 여전히 null입니다.

+0

인 텐트 서비스에서 응용 프로그램 클래스의 변수에 액세스했습니다. 활동에 대한 확신이 없습니다. –

+0

대신 공유 속성을 사용하지 않는 이유는 무엇입니까? –

+1

나는 그렇게 생각하지 않는다. 나는 또한이 나쁜 디자인이라고 부를 것입니다. 서비스는 UI와 무관해야합니다. 서비스에 UI의 값이 필요한 경우 서비스의 값을 설정하도록 UI를 디자인하십시오. –

답변

1

이 답변은 문제의 서비스가 다른 프로세스에서 실행 있다고 가정

예, 가능합니다. 일반적인 생각은 Activity이 AIDL 정의 된 인터페이스를 통해 Service 원격을 바인딩 할뿐만 아니라 Service이 인식하는 추가 AIDL 인터페이스를 구현하고 원격 Service의 콜백 대상으로 설정한다는 것입니다.

두 개의 AIDL 파일이 있어야합니다. 첫 번째 파일은 Service의 인터페이스를 설명하고 두 번째 파일은 Activity의 인터페이스를 설명합니다.

"콜백"방법은 더 이상 void 수 없지만, 관심있는 값을 반환하지만 이러한 계획의 구현은, "원격 서비스 콜백"this answer에 설명 매우 유사하다

.

디자인 고려 사항 :

위의 구성표를 사용하면 Activity에서 값을 가져올 수 있지만이 경로를 사용해야한다고 생각하지 않습니다. 사용 사례 설명에서 Activity이 다시 시작될 때 Service에 일부 값만 전달하려는 것으로 보입니다. 어쨌든 Service이 바인딩되었으므로 setSomeValue(int value) 메서드를 AIDL 정의에 추가하고이 메서드를 onServiceConnected() 콜백에서 호출 할 수 있습니다.

+1

AIDL 파일은 여러 응용 프로그램간에 서비스를 공유하려는 경우에만 필요합니다. – piotrpo

+0

@ piotrpo, 좋은 지적! IPC가 관련되어 있다고 가정했지만 지금은 서비스가 어느 프로세스에 존재하는지에 대한 질문에는 언급되어 있지 않습니다. – Vasiliy

0

예 가능합니다. 당신은 서비스가 결합 된 직후 활동을 다시 반환하는 서비스의 방법을 준비해야 : 서비스 활동에 바인딩 한 후

public void bindActivity(MyActivity activity){...} 

가 그럼 그냥 매개 변수로 MyActivity.this이 메소드를 호출합니다. 그러나

...

당신은 아마 그것을 할 것이다. LocalBroadcastManager를 사용하여 이벤트와 데이터를 전달하거나 Otto와 같은 좀 더 효율적인 솔루션을 사용하여이 작업을 수행 할 수 있지만 여전히 한 구성 요소의 필드/메소드에 직접 액세스 할 필요가 없습니다.

+0

'서비스'가 '활동'에 의존하는 것은 좋지 않습니다. 이 메쏘드의 매개 변수가 어떤 인터페이스가된다면 훨씬 더 깨끗하게 될 것이고,'MainActivity'는 단지 그것을 구현할 것입니다. – Vasiliy

+0

제 생각에 유일하게 "깨끗한"해결책은 메시지 기반 메시지입니다. 물론 몇 가지 인터페이스를 소개하는 것은 OOD 규칙에 따라 좋은 생각이지만 여전히 질문은 디자인이 아니라 구현입니다. – piotrpo

+0

메시징이 필요 없습니다. '서비스'가 묶여 있으므로 간단한 함수 호출만으로 충분합니다. 인터페이스는 구현의 일부입니다. 그렇지 않으면 구현이 깨끗하지 않습니다. – Vasiliy