2013-02-28 8 views
2

여러 타이머가있는 앱이 있습니다. 필자가 시작하면 이클립스의 Logcat에서 카운트 다운되는 것을 볼 수있다. 나는 돌아 가기 버튼을 누르면 때CountDownTimer가 백그라운드에서 계속 체크 - onResume에서 카운트를 어떻게 검색합니까?

onStop()는합니다 (onTick() 멀리 진드기에 계속) 응용 프로그램에서 호출하지만 타이머가 로그 캣에서 카운트 다운 계속됩니다.

onResume()이 호출 될 때 내가 원하는 것은 타이머를 가져 와서 계속 카운트 다운하고 계속 진행하고 싶습니다. 이것이 가능한가?

여기가 카운트 다운을 시작하는 내 버튼입니다 :

//Button1 Timer 
final CountDown button1 = new CountDown(420000,1000,bButton1); 
bButton1.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     button1.start(); 
     long currentTime = System.currentTimeMillis(); 
     //Set start time for calculating time elapsed if needed 
     saveTime("START_TIME_BUTTON1", currentTime); 
    } 
});  

//Button2 Timer 
final CountDown button2 = new CountDown(360000,1000,bButton2); 
bButton2.setOnClickListener(new OnClickListener() { 

    @Override 
    public void onClick(View v) { 
     button2.start(); 
     long currentTime = System.currentTimeMillis(); 
     //Set start time for calculating time elapsed if needed 
     saveTime("START_TIME", currentTime); 
    } 
}); 

onResume()은 다음과 같습니다

이 실제로 작동
@Override 
protected void onResume() { 
    // TODO Auto-generated method stub 
    super.onResume(); 

    //Reset the timers on appropriate buttons if there was something running 
    //If nothing was running or timer finished - have button in default state 

    //See if there was a button1 timer running - if not, it will be 0 
    SharedPreferences start = PreferenceManager.getDefaultSharedPreferences(this); 
    long startTime = start.getLong("START_TIME_BUTTON1", 0); 
    long timeElapsed = (System.currentTimeMillis()-startTime); 
    long timeRemaining = (420000 - timeElapsed);   
    if (timeRemaining == 0) { 
    } else if (timeRemaining > 0) { 
     final CountDown button1Timer = new CountDown(timeRemaining,1000,bButton1); 
     button1Timer.start(); 
     long currentTime = System.currentTimeMillis(); 
      saveTime("START_TIME", currentTime);    
    } else { 
    } 
} 

이 - onResume()은 첫 번째가 될 또 다른 타이머 권리를 시작, 텍스트에 해당 숫자가 표시되고 onTick() 메소드를 사용하여 계속 카운트 다운됩니다. 하지만 이제 logcat은 단 하나 대신 카운트 다운 2 타이머를 보여줍니다!

궁극적으로 나는 다른 타이머를 시작하고 싶지 않습니다. 단지 카운트 다운에있는 첫 번째 타이머를 시작하고 onTick() 디스플레이를 적절하게 가지고 싶습니다. 그렇게 할 수있는 방법이 있습니까? 서비스가 내가 원하는 것일까? 백그라운드에서 계속 체크 한 이후로 이미 서비스입니까?

나는이 일을 수행하는 것이 가장 좋은 방법에 대해 약간 혼란스러워합니다.

답변

4

onTick()은 남은 시간이 0에 도달하거나 CountDownTimer에서 cancel()으로 전화 할 때까지 계속 호출됩니다. 따라서 onStop() 방법의 경우 알림 수신을 중지하려는 타이머에 cancel()으로 전화해야합니다.

안드로이드의 CountDownTimer 구현은 Handler을 사용하여 Message을 각 틱 이후에 Handler으로 보내도록 큐하여 타이밍을 수행합니다. 불행히도 CountDownTimer를 일시 중지 할 수있는 방법이 없으므로 현재 수행중인 것처럼 적절한 값으로 Timer을 새로 작성해야한다고 생각합니다.

timeElapsed를 계산할 때는 System.currentTimeMillis()을 사용하면 안되며, 언제든지 변경할 수 있으므로 SystemClock.elapsedRealtime()을 사용해야합니다. System.currentTimeMillis()은 벽시계 (시간 및 날짜)에 사용되는 타이머이므로 예기치 않게 변경 될 수 있습니다 (Android documentation 참조).

+0

감사합니다. 이것의 시선을 사로 잡는다 - 나는 아직도 당신이 나의 코드에서 상상할 수있는 것처럼 이것에 대해 아주 새로운 것이다. 이걸 내가 원하는대로 할려고 노력하는거야! 건배! – Hanny

+0

또한 - 매우 멍청한 질문이지만 - .cancel()을 어떻게 호출합니까? 그 타이머에? button1.cancel(); onResume 메소드에 추가하면 중단됩니다. 이 작업을 수행하는 방법을 잘 모름 ... – Hanny

+0

CountDown 클래스가 CountDownTimer를 확장합니까? 그렇다면 오류를 게시 할 수 있습니까? – AngusMorton