2012-11-07 7 views
2

bindService()에 문제가 있습니다. 생성자에서 바인딩을 시도하고 있는데, 두 개의 파벌 블 엑스트라가 포함 된 인 텐트를 제공하고 있습니다. 생성자가 onResume()에서 호출되고 해당 서비스의 onBind() 메서드에서 두 개의 추가 기능을 구문 분석하고 구문 분석의 결과로 null을 반환 할 수 있습니다.Android bindService가 작동하지 않습니다.

Eclipse에서 실행을 통해 앱을 처음 실행하면 바인딩이 서비스에 의해 (예상대로) 거부됩니다. 서비스의 onBind() 메서드가 호출되고 null을 반환합니다. 그러나 bindService() 메서드는 응용 프로그램 쪽에서 true을 반환합니다 (바인딩이 통과하지 않았으므로!).

다음과 같이하면 문제가 발생합니다. HOME 버튼을 눌러 앱을 다시 시작합니다 (onResume()이 다시 실행되어 앱이 서비스에 다시 바인딩을 시도 함). 이번에는 서비스 onBind()도 실행되지 않는 것 같습니다! 하지만 앱의 bindService()은 여전히 ​​true을 반환합니다!

다음은 내 문제를 이해하는 데 도움이되는 몇 가지 샘플 코드입니다.

응용 프로그램 측 :

// activity's onResume() 
@Override 
public void onResume() { 
    super.onResume(); 
    var = new Constructor(this); 
} 

// the constructor 
public Constructor(Context context) { 
    final Intent bindIntent = new Intent("test"); 

    bindIntent.putExtra("extra1",extra_A); 
    bindIntent.putExtra("extra2",extra_B); 

    isBound = context.bindService(bindIntent, connection, Context.BIND_ADJUST_WITH_ACTIVITY); 

    log("tried to bind... isBound="+isBound); 
} 

서비스 측면 : 나는 결코, 그래서

@Override 
public void onServiceConnected(final ComponentName name, final IBinder service) { 
    log("onServiceConnected(): successfully connected to the service!"); 

    this.service = MyAIDLService.asInterface(service); 
} 

: 내가 사용

private MyAIDLService service = null; 

@Override 
public void onCreate() { 
    service = new MyAIDLService(getContentResolver()); 
} 

@Override 
public IBinder onBind(final Intent intent) { 
    log("onBind() called");  

    if (intent.getAction().equals("test") { 
     ExtraObj extra_A = intent.getParcelableExtra("extra1"); 
     ExtraObj extra_B = intent.getParcelableExtra("extra2"); 

     if (parse(extra_A,extra_B)) 
      return service; 
     else { 
      log("rejected binding"); 
      return null; 
     } 

    } 
} 

ServiceConnection는 다음 onServiceConnected() 방법을 보유하지 "서비스에 성공적으로 연결되었습니다!"를 확인하십시오. 로그. 내가 이클립스를 통해 앱을 실행할 때 처음에는 "isBound = true"뿐만 아니라 "거부 된 바인딩"로그를 얻었지만, 거기에서 "isBound = true", "거부 된 바인딩"을 얻지 못한다. 다시는 오지 마라.

내가 거부했을 때도 성공적으로 바인딩되었음을 안드로이드가 인식 할 가능성이 있습니다. 이상적으로, 나는 또한 '언 바인드'도 강제 할 수 있지만, 불가능합니다 : 나는 앱을 죽일 때 서비스의 onUnbind() 메소드에있는 로그를 얻고 있기 때문에 이것이 의심 스럽습니다. 처음에는 구속력이 없어!).

답변

4

동일한 문제가 있지만 내 서비스가 실제로 시작되지 않았 음을 알았습니다. 아마도 "Context.BIND_AUTO_CREATE"를 플래그에 추가하면 서비스가 생성되고 시작됩니다. Context.BIND_ADJUST_WITH_ACTIVITY가 시작되므로 onServiceConnected가 호출되지 않을 수도 있습니다. bindService() 호출이 true를 반환했지만 나에게 해당되지 않습니다.

관련 문제