반응형

 보통 앱을 사용하는 동안, 전면(foreground)의 액티비티는 때때로 pause의 이유가 되는 다른 보여지는 컴포넌트들(components)에 의해 가려지게 됩니다. 예를 들어, 반투명한 액티비티가 열릴 때( 다이얼로그 (Dialog) 스타일 중 하나 처럼), 이전 액티비티는 일시정지(pause) 됩니다. 현재 액티비티는 포커스에 없지만 여전히 부분적으로 보여지며 일시정지된(paused) 상태로 남아있습니다.


 어쨋든, 액티비티는 완전히 가려졌고 보이지 않을 때, stop 이 됩니다.(다음 시간에 살펴보겠습니다.)


 여러분의 액티비티가 paused 상태로 들어감으로서, 시스템은 액티비티에 있는 onPause() 메소드를 호출합니다. 이 곳에 paused 되어 있는 동안 지속되면 안되는 동작들을 멈추거나(video와 같은) 사용자가 여러분의 앱을 떠날 때 영구적으로 저장해야만 하는 어떤 정보들을 저장하도록 해야 합니다. 만약 사용자가 여러분의 액티비티에 되돌아 왔다면, 시스템은 onResume() 메소드를 호출하고 이어하기(resume)를 합니다.


 Note: 여러분의 액티비티가 onPause() 호출을 받았을 때, 액티비티는 잠시동안 일시정지(pause)되고 사용자가 여러분의 액티비티에서 포커스를 반환 할 수 있다는 표시일 수 있습니다. 어쨋든, 일반적으로 onPause()는 사용자가 여러분의 앱을 떠나는 것을 처음 표시됩니다.


 

 

그림 1. 여러분의 액티비티를 반투명 액티비티가 가렸을 때, 시스템은 onPause()를 호출하고 액티비티는 Paused 상태에서 잠시 기다리게 됩니다.(1) , 만약 사용자가 paused 상태에서 액티비티로 돌아오면, 시스템은 onResume() 을 호출합니다.(2)




액티비티 일시정지(Pause Your Activity)

---------------------------------------

 시스템이 여러분의 액티비티에 대해 onPause() 를 호출할 때, 기술적으로는 여러분의 액티비티가 부분적으로나마 보인다는 것을 의미합니다. 하지만, 대부분의 경우 사용자가 액티비티를 떠났고 곧 이어 Stopped 상태로 들어간다는 것을 나타냅니다. 여러분은 일반적으로onPause() 콜백(callback)안에서 아래 내용을 사용하셔야 합니다.


° 애니메이션들(animations)이나 CPU 를 소모해야만 하는 동작들을 정지하기

° 사용자가 액티비티를 떠날 때 영구적으로 저장되기를 기대하는( 이메일 원고(a draft email)와 같은) 저장되지 않은 변경사항들을 커밋(commit)하기

° 브로드캐스트 리시버(broadcast receivers), 센서(GPS 처럼) 제어들, 사용자가 필요하지 않고 액티비티가 일시정지되어 있는 동안 베터리 소모에 영향을 미치는 어떤 리소스들(resources) 처럼 시스템 리소스들 없애기



예를 들어, 만약 여러분의 어플이 Camera를 사용한다면, onPause() 메소드는 이것을 없애기에 좋은 위치입니다.

 @Override

public void onPause() {

    super.onPause();  // Always call the superclass method first


    // Release the Camera because we don't need it when paused

    // and other activities might need to use it.

    if (mCamera != null) {

       mCamera.release()

      mCamera = null;

    }

}


 일반적으로, 여러분은 onPause()에서 영구적인 저장장치에 사용자의 변경사항( 하나의 form안에 들어간 개인 정보같은 )을 저장하지 않도록 합니다. 여러분은 오직 사용자가 변경사항들을 틀림없이 자동으로 저장되어지기를 기대할 때( email의 원고(draft)를 작성할때와 같이),onPause()안에 사용자의 변경사항을 저장하도록 하셔야 합니다. 어쨋든, 여러분은 onPause() 동안 데이터베이스(database) 쓰기와 같은CPU를 강하게 사용하는 작업은 회피해야만 합니다. 왜냐하면, 다음 액티비티로 보여지는 것이 전환되는 것을 느리게 할 수 있기 때문입니다.( 여러분은 onStop() 하는 동안 무거운 로딩(loadshutdown 명령들을 수행하도록 대체하셔야 합니다.)


 여러분은 사용자가 액티비티를 떠나기 시작한다면 빠르게 사용자의 다음 목적지로 전환되도록 하기 위해 onPause() 메소드 안에 비교적 간단한 연산의 양을 유지하셔야 합니다.


 Note: 여러분의 앱이 pause 될때, 액티비티 인스턴스는 메모리안에 거주하며 액티비티가 resume 될 때 다시 호출됩니다. 여러분은Resumed 상태로 올라오면서 읽어지는 어떤 콜백(callback) 메소드들에도 컴포넌트들(components)을 다시 초기화 시킬 필요가 없습니다.




액티비티 이어하기(Resume Your Activity)

------------------------------------------

 Paused 상태에서 사용자가 여러분의 액티비티를 이어할 때(resume), 시스템은 onResume() 메소드를 호출합니다.


 액티비티가 가장 처음 만들어질 때를 포함하여, 여러분의 액티비티가 화면의 전면(foreground)에 나타날때, 시스템은 onResume()메소를 호출한다는 것을 알아야 합니다. 여러분은 onPause() 동안 없앴던 컴포넌트들(components) 과 매번 액티비티가 Resumed 상태가 될 때마다 수행해야만 하는 작업들( 애니메이션들(animations) 시작과 오직 사용자 포커스를 가진 액티비티에서만 사용되는 컴포넌트들(components) 초기화 같은)을 초기화 하도록 onResume()을 구현해야 합니다.


 아래의 onResume() 예제는 위의 onPause() 예제에 대응 되어 있습니다. 그래서 액티비티가 pause 될 때 없앴던 카메라(camera)를 초기화 하고 있습니다.


 @Override

public void onResume() {

    super.onResume();  // Always call the superclass method first


    // Get the Camera instance as the activity achieves full user focus

    if (mCamera == null) {

        initializeCamera(); // Local method to handle camera init

    }

}


반응형

+ Recent posts