[Android] 안드로이드 서비스가 실제로 연결될 때까지 어떻게 기다려야합니까?


Answers

나는 똑같은 문제가 있었다. onServiceConnected 바인딩 된 서비스 종속 코드를 넣고 싶지 않았습니다. onStartonStop, 을 바인드 / onStart 바인드하고 싶었 기 때문에 활성 코드가 다시 돌아올 때마다 코드를 다시 실행하지 않으려했습니다. 활동이 처음 생성 될 때만 실행하고 싶었습니다.

드디어 내 onStart() 터널 비전을 극복하고 이것이 onServiceConnected 실행 여부를 나타내는 Boolean을 사용했습니다. 그렇게하면 매번 모든 시작 작업을 실행하지 않고도 onStart 에서 onStop 및 bindService에서 서비스를 다시 바인딩 해제 할 수 있습니다.

Question

IDownloaderService.aidl에 정의 된 서비스를 호출하는 활동이 있습니다.

public class Downloader extends Activity {
 IDownloaderService downloader = null;
// ...

Downloader.onCreate (Bundle)에서 bindService를 시도했습니다.

Intent serviceIntent = new Intent(this, DownloaderService.class);
if (bindService(serviceIntent, sc, BIND_AUTO_CREATE)) {
  // ...

ServiceConnection 객체 sc 내에서이 작업을 수행했습니다.

public void onServiceConnected(ComponentName name, IBinder service) {
  Log.w("XXX", "onServiceConnected");
  downloader = IDownloaderService.Stub.asInterface(service);
  // ...

모든 종류의 Log.xx를 추가하면 if (bindService (...))가 실제로 ServiceConnection.onServiceConnected가 호출되기 전의 코드 (즉, 다운로더가 여전히 null 일 때)가 발생하여 문제가 발생한다는 것을 알았습니다. ApiDemos의 모든 샘플은 사용자 동작에 의해 트리거 될 때 서비스를 호출하기 만하면 이러한 타이밍 문제를 피할 수 있습니다. bindService가 성공한 후에이 서비스를 올바르게 사용하려면 어떻게해야합니까? ServiceConnection.onServiceConnected가 안정적으로 호출되기를 기다리는 방법은 무엇입니까?

또 다른 질문이 관련되어 있습니다. 모든 이벤트 처리기 : Activity.onCreate, View.onClickListener.onClick, ServiceConnection.onServiceConnected 등 (실제로 "주 스레드"와 같은 문서에서 언급 한) 같은 스레드에서 실제로 호출됩니까? 그들 사이에 인터리브가 있습니까, 아니면 안드로이드가 모든 이벤트를 하나씩 처리하도록 예약할까요? 또는 정확히 ServiceConnection.onServiceConnected가 실제로 호출 될 때입니까? Activity.onCreate가 완료되거나 언젠가 A.oC가 실행 중일 때가 있습니까?




이전과 비슷한 일을했지만 다른 점은 서비스에 구속력이있는 것이 아니라 단지 시작하는 것뿐입니다.

호출자 / 활동에 알림을 보내려는 서비스의 의도를 방송합니다.




이 해결 방법은 바인딩 된 서비스가 응용 프로그램의 주 프로세스와 다른 프로세스에서 실행중인 경우에만 노력하고 기다릴 가치가 있다는 것을 알았습니다.

동일한 프로세스 (또는 응용 프로그램)에서 데이터와 메서드에 액세스하기 위해 싱글 톤 클래스를 구현했습니다. 클래스가 일부 메서드에 대한 컨텍스트가 필요한 경우에는 응용 프로그램 컨텍스트를 단일 클래스에 유출합니다. 물론 "즉시 실행"이 중단 될 때 나쁜 결과가 발생합니다. 그러나 그것은 전반적으로 더 나은 타협이라고 생각합니다.




Links