2014-04-29 2 views
0

4 가지 활동 인 ABCD가 있습니다.뒤로 버튼을 누를 때 활동을 죽이지 마십시오.

처음에 사용자가 ABCD로 이동하면 C 버튼을 탭하기 전에 C 버튼을 탭하기 전에 뒤로 버튼을 탭하여 다시 D 버튼으로 가져갈 수 있습니다.

문제는 D가 활동 D보기에서 카운트 다운 및 업데이트를 계속해야하는 카운트 다운 타이머를 실행하고 있다는 것입니다. 현재 C로 돌아가서 다시 D로 이동하면 다시 D로 이동합니다. 카운트 다운 타이머는 아직 실행 중이지만 D에 대한 새로운 활동이 만들어져 있기 때문에 연결되지 않았습니다.

나는 사용자가되고 싶습니다. D에 영향을 미치거나 파괴하지 않고 C로 되돌아 갈 수있어서 내 타이머를 계속 볼 수 있습니다.

마지막으로 사용자가 B를 클릭하면 C 및 D 활동 (및 카운트 다운 타이머)이 모두 삭제됩니다.

+3

당신은 이런 종류의 작업을위한 서비스를 만드는 것을 고려해야합니다. 그렇지 않으면 D 액티비티가 무언가에 닫히고 다시 돌아올 때 다른 시간을 계산할 수 있습니다. –

+0

Application 클래스를 사용하여 전역 데이터를 저장할 수도 있습니다 시작 시간 및 측정 시간과 같은 타이머의 값을 입력하고 이러한 저장된 값을 사용하여 활동을 입력 할 때마다 타이머를 만듭니다. – Zielony

+0

타이머를 계속 실행하여 특정 시간에 카운트 다운 전체에 걸쳐 알람을 트리거 할 수 있습니다. 내가 서비스를 들여다 볼께. 고마워. –

답변

0

사용자가 활동을 떠날 때 saveInstanceState 콜백에 타이머 값과 현재 시간을 저장하는 것이 쉽지 않습니다. 액티비티가 다시 생성되면 타이머 값에 (현재 시간 - lastSavedTime)을 더한 값을 사용하고 타이머를 설정합니다.


잘 작동해야하지만 조각과 ViewPager를 사용하면 더 좋은 방법으로이를 수행 할 수 있습니다.

이전에 ViewPager를 사용하지 않은 경우입니다. 화면을 왼쪽이나 오른쪽으로 스 와이프하여 여러보기간에 전환 할 수있는 구성 요소입니다. 기본적으로 뷰 페이저는 현재보기와 그 옆에있는보기를로드합니다. 따라서 페이지 1 (색인 0)에있는 경우 1 페이지와 2 페이지가로드됩니다. 2 페이지, 2 페이지, 1 페이지 및 3 페이지에있는 경우 등이로드됩니다. 좋은 소식은 이제 4 개 조각이로드이

mViewPager.setOffscreenPageLimit(3); 

같은 간단한 코드를 사용하여 각 조각 근처에로드 할 페이지 수를 변경할 수 있습니다. 따라서 화면에 4 개의 조각이 모두로드되었습니다. developers.android.com에 따르면 다른 모든보기 (하나는 화면 제외)가로드되지만 유휴 상태이므로 조각 D 안에 타이머를 넣을 수는 없다고 생각합니다. 그러나 문제는 없습니다. 하나의 활동. 당신이 가진 유일한 활동에 타이머를 구현하면 페이지가 바뀔 때이 활동이 파괴되지 않으므로 잘 작동합니다. 그러나 사용자가 다른 앱으로 전환하여 활동이 멈출 수 있기 때문에 여전히 동일한 데이터 (타이머 데이터 + 현재 시간)를 저장해야합니다.

마지막으로해야 할 일은 조각 내의 타이머 데이터에 액세스하는 것입니다. 나는 액티비티와 프래그먼트 사이에서 통신하는 방법에 대한 튜토리얼이 너무 많기 때문에 설명하지는 않겠지 만 프래그먼트 내부에 인터페이스를 선언하고 액티비티로이 인터페이스를 구현하고 프래그먼트 내부에서이 인터페이스를 사용하여 타이머 데이터.

두 번째 솔루션은 훨씬 복잡하지만 사용자에게 더 나은 환경을 제공하고 성능이 크게 향상됩니다. 마녀가 당신에게 가장 적합하다고 결정하십시오.행운을 빌어 요

+0

답장을 보내 주셔서 감사합니다. 사용자 환경에도 상당히 좋을 것으로 생각합니다. –

1

당신은 당신이 백그라운드 작업의 이러한 종류의 서비스를 사용한다, 그러나이

Intent intent = new Intent(this, D.class); 
intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
startActivity(intent); 

처럼 C에서 그것을 배경으로 D 활동을 넣고 다시 시작이

@Override 
public void onBackPressed() { 
    Intent intent = new Intent(this, C.class); 
    intent.setFlags(Intent.FLAG_ACTIVITY_CLEAR_TOP | Intent.FLAG_ACTIVITY_SINGLE_TOP); 
    startActivity(intent); 
} 

을 사용할 수 있습니다 .

+0

방금 ​​시도한 결과 D에서 뒤로 누르면 C가 아닌 홈 화면으로 이동합니다. –

+0

수정했습니다. 지금 시도하십시오 – DDsix

+0

이제 D의 새 인스턴스가 다시 생성되므로 타이머가 더 이상 D보기를 업데이트하지 않습니다. –

관련 문제