2012-10-09 5 views
2

서비스를 생성했으며 bindService 함수를 사용하여 내 액티비티를 통해 액세스하고 있지만 내 활동이 종료 된 후에도 서비스를 계속 실행하려고했습니다. startService에 대한 호출로 서비스에 메시지를 보냅니다.

내가 이전에 내가 onServiceConnected가 호출되는 일단 내가 (서비스 단위) handler에 메시지를 전송 있어요 ServiceConnection으로 bindService을 사용하고 있었다 startService을 사용했지만 그것에 대해

.

그러나 startService으로 메시지를 보낼 수있는 방법은 모르겠다. 나는 메시지 처리기로 메시지를 보내기 위해 onServiceConnected과 같은 곳이 없다.

참고 : 내 서비스에서 위젯을 업데이트 할 때도 내 응용 프로그램이 작동하지 않아도 서비스를 계속 실행하고 싶습니다.

그래서 서비스는 활동이 종료되면 서비스가 업데이트됩니다 활동

  • 내부의 두 가지 역할

    1. 업데이트 텍스트 뷰를 가지고 위젯
  • +0

    서비스를 어떻게 시작합니까? 서비스를 시작하기 위해 의도를 사용하고있는 것일 수 있습니다. –

    +0

    예, 백그라운드에서 계속 실행하고 싶습니다. 저는 'startService'를 사용하고 있습니다. – Hunt

    +0

    당신이 정확히 당신의 서비스에 보내고 싶은 것이 있습니까? 당신은 서비스를 시작하기 위해 사용했던 동일한 의도를 통해 그것을 보낼 수 있습니다. 그 일을 시도 했니? –

    답변

    4

    당신은 당신의 서비스와 통신하는 3 옵션이 있습니다

    • 는 의도를 추가로 넣고 startService를 호출합니다. 당신은
    • 사용 bindService는

    그것은 귀하의 서비스에 START_STICKY를 사용하십시오 서비스가 이미 메신저를 만들기

  • 을 실행중인 경우에도, 그것을 여러 번 호출하고 서비스와 통신하는 데 사용할 수 있습니다 활동이 완료된 후에도 계속 실행되며 알림을 표시하려면 startForeground() 또는 잠시 후 (즉, 평균 30 분에서 1 시간) SO에 의해 서비스가 종료됩니다.

    시작 흐름 :

    • ClientActivity (CA)는 서비스를 시작하고 서비스 목적에 추가로 CA 메신저 주소를 전송한다.
    • 서비스 시작시 서비스 메신저 주소를 CA (메시지를 보내려면 CA 메신저 주소 사용)로 다시 보냅니다.
    • 마지막으로 서비스에서 START_STICKY를 반환합니다.

    이렇게하면 클라이언트와 서버가 서로 다른 메신저 주소를 알 수 있으므로 바인딩이 필요하지 않습니다.

    이 서비스를 중지하려면 다음

    서비스를 중지하기를 당신의 활동에 때라도 사용

    stopService(new Intent(ActivityClass.this, ServiceClass.class)); 
    

    재 연결 :

    당신이 clieant 활동 (CA)를두면와 앱을 다시 시작할 때 서비스에 다시 연결하려면 두 가지 옵션이 있습니다.

    - CA에서 startService를 다시 호출하십시오. 그러면 서비스에 onStartCommand이 다시 호출됩니다. onCreate() 서비스는 서비스가 아직 실행되고 있지 않은 경우에만 호출됩니다. 위에서 설명한 시작 흐름을 사용하여 Messenger 서비스를 가져올 수 있습니다.

    - 서비스 메신저를 공용 및 정적 public static Messenger mMsgService = null;으로 만들 수 있습니다. 따라서 CA가 시작되면 서비스 메신저가 초기화되었는지 (null이 아닌지) 확인할 수 있으며 서비스 메신저가 서비스와 통신하는 데 사용됩니다. 설정 도구가 멈 추면 mMsgService = null;

    행운을 빕니다.

  • +0

    나는 Messenger를 사용하여 클라이언트를 등록하고 값을 가져 오므로 첫 번째 옵션은 제대로 작동하지 않습니다. 하지만 서비스에 메시지를 보내고 활동에서받을 때 나는 'bindService'를 사용해야합니다. 그러나 내가 존재할 때 나는 unBindService에 도착하고 서비스는 멈 춥니 다. – Hunt

    +0

    서비스를 시작하면 클라이언트 메신저 주소를 추가로 보낼 수 있습니다 서비스에 대한 의도로 서비스 시작시 메신저 주소를 클라이언트에 다시 보냅니다 (클라이언트 메신저 주소를 사용하여 메시지를 보냅니다). 마지막으로 서비스 시작에서 START_STICKY를 반환하여 계속 실행합니다. 이 두 가지 모두로 클라이언트와 서버는 서로 다른 메신저 주소를 알 수 있으며 바인드가 필요하지 않습니다. – Luis

    +0

    나는 귀하의 접근 방법을 시도했지만 활동을 떠나고 신청서에 다시 오면 서비스 메신저 주소를 분실하여 서비스를 중단 할 수 없습니다. – Hunt

    0

    다른 서비스와 통신 할 다른 방법이 없습니다 해당 서비스에 바인딩하는 것보다 활동에서 서비스 바인딩은 꼭 필요한 것은 아니라는 것을 의미합니다. 서비스가 서비스의 무효가 될 것이라는 의미입니다. unbindService 메소드를 호출하지 않으면 바인드 된 서비스가 항상 실행됩니다. 따라서 솔루션은 서비스에 바인드되며 unbindService onDestroy를 호출하지 않습니다.

    +0

    바인딩 해제하지 않으면'서비스 누설 예외 '가 발생합니까? – Hunt

    +0

    아니요 당신이 응용 프로그램 컨텍스트 – user936414

    +0

    을 사용하여 서비스를 시작하면 'this.getApplicationContext()'를 전달하더라도 getty를 얻을 수 없습니다.'android.app.ServiceConnectionLeaked : Activity com.ha.home.MyActivity'가 ' ServiceContnection com.ha.home.MyActivity $ 1 @ 448163e8' 원래 여기에 바인딩되었습니다. – Hunt

    관련 문제