2

현재 저는 보수계 응용 프로그램을 작성 중입니다. 처음에는 한 번의 활동 인 PedometerActivity로 시작했습니다. 이 활동은 백그라운드에서 실행되어야하는 서비스를 시작하고 서비스에 바인딩합니다. 코드가 길어서 제 질문에 도움이 될 것이라고 생각되는 부분을 제공 할 것입니다. 서비스탭 사이에서 로컬 서비스를 실행하는 방법은 무엇입니까?

그때 따라서 3 개 탭 3 개 조각으로 tablayout이 내 응용 프로그램을 수정
/*Local service binding*/ 
    public class PedometerBinder extends Binder { 
     public PedometerService getService() { 
      return PedometerService.this; 
     } 
    } 


    /*A client is binding to the service with bindService() 
    * Returns the IBinder object received in 
    * ServiceConnection.onServiceConnected(ComponentName,IBinder)*/ 
    @Override 
    public IBinder onBind(Intent intent) { 
     return new PedometerBinder(); 
    } 

를 확장하는 서비스 클래스에서

//Bind service 
    private ServiceConnection mServiceConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 

      //binder to communicate with the service 
      PedometerService.PedometerBinder mBinder = (PedometerService.PedometerBinder)service; 

      mPedometerService = mBinder.getService(); 
      mPedometerService.registerCallback(mCallback); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mPedometerService = null; 
     } 
    }; 

private void startPedometerService() { 
     if (!isPedometerService) { 
      Log.v(TAG, "Start service"); 
      isPedometerService = true; 

      //start service 
      Intent intent = new Intent(getApplicationContext(), 
        PedometerService.class); 
      startService(intent); 
     } 
    } 

    //Bind to the service 
    private void bindPedometerService() { 
     Log.i(TAG, "Bind service"); 

     Intent intent = new Intent(PedometerActivity.this, PedometerService.class); 
     bindService(intent, mServiceConnection, 
       Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND); 
    } 

    //close connection with service 
    private void unbindPedometerService() { 
     Log.i(TAG, "Unbind service"); 
     unbindService(mServiceConnection); 
    } 

    //Stop the service that had been started 
    private void stopPedometerService() { 
     Log.i(TAG, "Stop service"); 
     if (mPedometerService != null) { 

      //stop service 
      Intent intent = new Intent(PedometerActivity.this, PedometerService.class); 
      stopService(intent); 

      isPedometerService = false; 
     } 
    } 

@Override 
    public void onResume() { 
     Log.i(TAG, "onResume"); 
     super.onResume(); 

     startPedometerService(); 
     bindPedometerService(); 


    } 


    @Override 
    public void onStop() { 
     super.onStop(); 
     Log.i(TAG, "onStop"); 
     stopPedometerService(); 

    } 

    public void onDestroy() { 
     super.onDestroy(); 

     unbindPedometerService(); 
     stopPedometerService();   

    } 

. 나는 PedometerFragment에 PedometerActivity의 코드를 붙여 넣어 문제는 문제가 내가 탭 사이를 전환 할 때 실행되는 서비스를 유지하는 데 문제입니다

//Bind service 
    private ServiceConnection mServiceConnection = new ServiceConnection() { 
     public void onServiceConnected(ComponentName className, IBinder service) { 

      //binder to communicate with the service 
      PedometerService.PedometerBinder mBinder = (PedometerService.PedometerBinder)service; 

      mPedometerService = mBinder.getService(); 
      mPedometerService.registerCallback(mCallback); 
     } 

     public void onServiceDisconnected(ComponentName className) { 
      mPedometerService = null; 
     } 
    }; 

private void startPedometerService() { 
     if (!isPedometerService) { 
      Log.v(TAG, "Start service"); 
      isPedometerService = true; 

      //start service 
      Intent intent = new Intent(getActivity().getApplicationContext(), 
        PedometerService.class); 
      getActivity().startService(intent); 
     } 
    } 

    //Bind to the service 
    private void bindPedometerService() { 
     Log.i(TAG, "Bind service"); 

     Intent intent = new Intent(getActivity(), PedometerService.class); 
     getActivity().bindService(intent, mServiceConnection, 
       Context.BIND_AUTO_CREATE + Context.BIND_DEBUG_UNBIND); 
    } 

    //close connection with service 
    private void unbindPedometerService() { 
     Log.i(TAG, "Unbind service"); 
     getActivity().unbindService(mServiceConnection); 
    } 

    //Stop the service that had been started 
    private void stopPedometerService() { 
     Log.i(TAG, "Stop service"); 
     if (mPedometerService != null) { 

      //stop service 
      Intent intent = new Intent(getActivity(), PedometerService.class); 
      getActivity().stopService(intent); 

      isPedometerService = false; 
     } 
    } 

@Override 
    public void onResume() { 
     Log.i(TAG, "onResume"); 
     super.onResume(); 

     startPedometerService(); 
     bindPedometerService(); 


    } 


    @Override 
    public void onStop() { 
     super.onStop(); 
     Log.i(TAG, "onStop"); 
     stopPedometerService(); 

    } 

    public void onDestroy() { 
     super.onDestroy(); 

     unbindPedometerService(); 
     stopPedometerService();   

    } 

를 수정했습니다. FragmentStatePagerAdapter을 사용하고 있으므로 마지막 탭으로 이동하면 첫 번째 조각 (PedometerFragment)이 언로드됩니다. 나는 onSaveInstanceState에 다른 변수를 저장할 수 있었지만 모든 것이 다시 시작 되었기 때문에 이것은 도움이되지 않는 것처럼 보입니다.

답변

1

Activity 클래스의 서비스를 바인딩해야합니다. 그런 다음 인터페이스 또는 공용 메소드를 통해 연결된 Fragment에서 사용할 수 있습니다.

+0

그래, 잘 작동 했어. 조각 라이프 사이클 메소드가 서비스를 방해하지 않았어. – facilitator

+0

조각 라이프 사이클 메소드 .DID가 서비스를 중단했다. 너 스스로 말했어. – Mars

+0

프래그먼트 라이프 사이클 메소드 오버라이드 * – Mars

1

바운드 구성 요소가 파괴 되더라도 서비스를 중지하면 안됩니다. 그러나 onStop()에 명시 적으로 stopPedometerService()을 호출하고 있는데, 조각이 더 이상 시작되지 않을 때 호출됩니다.

stopPedometerService()onStop()onDestroy()에서 삭제하는 것이 좋습니다.

는 참조 자세한 목록보기처럼 작동 페이지 수가 많은 ,있을 때 https://developer.android.com/reference/android/support/v4/app/FragmentStatePagerAdapter.html

호출기이 버전이 더 유용하다. 사용자가 페이지를 볼 수 없으면 전체 조각이 손상되어 해당 조각의 저장된 상태 만 유지됩니다.

+0

더 많은 문제가 발생했지만 onStop에서 stopService 메소드 호출을 제거했지만 서비스가 중단되지 않았습니다. @Stanislav Bondar 솔루션이 최고입니다. FragmentStatePagerAdapter의 구현은 문제와 독립적입니다. 감사합니다. – facilitator

+0

Stanislav의 솔루션은 실제로 솔루션이 아닙니다 ... 서비스가 중단 된 이유를 알고 싶었습니다. 당신에게 보여주었습니다. 활동에 바인딩 할 필요가 없습니다. – Mars

+0

나는 당신이 onDestroy()에서도 stopPedometerService를 가지고 있다는 것을 놓쳤다. 그래서 나는 나의 대답을 업데이트했다. – Mars