onStart ()와 onResume ()의 차이점


176

onStart()전환 상태 의 의미를 얻을 수 없습니다 . 이 onResume()메소드는 항상 이후에 호출 onStart()됩니다. 왜이 될 수 없습니다 onResume()후 호출 onRestart()onCreate()방법은 단지 제외 onStart()? 그 목적은 무엇입니까?

없이는 왜 살 수 없습니까 onStart()? 나는 여전히 그것을 중복으로 간주합니다 (아마도 그 의미를 완전히 이해하지 못하기 때문에).


응용 프로그램 수명주기를 보려면 여기를 참조하십시오. d.android.com/guide/topics/fundamentals.html
ykatchou

이 물건은 쉽다. 지금,이 함께 조각을 설명하는 시도 의가 있음을 나중에 프로그래밍 안드로이드!
Scott Biggs

아래 답변에는 설명이있는 실제 코드가 없습니다. 이것은 조각으로 설명하는 코드입니다.
Atul

답변:


306

왜 onStart ()를 제외하고 onRestart () 및 onCreate () 메소드 후에 onResume ()이 호출 될 수 없습니까? 그 목적은 무엇입니까?

첫 번째 대답이 꽤 길었으므로 더 이상 확장하지 않으므로 시도해 보겠습니다.

public DriveToWorkActivity extends Activity
    implements onReachedGroceryStoreListener {
}

public GroceryStoreActivity extends Activity {}

참고 사항 : 나는 의도적으로 super.onCreate(...)등을 호출하지 않았습니다 . 이것은 의사 코드이므로 여기에 예술 라이센스를 부여하십시오. ;)

DriveToWorkActivity따르기 위한 방법 ...

protected void onCreate(...) {
    openGarageDoor();
    unlockCarAndGetIn();
    closeCarDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

protected void onStart() {
    startEngine();
    changeRadioStation();
    switchOnLightsIfNeeded();
    switchOnWipersIfNeeded();
}

protected void onResume() {
    applyFootbrake();
    releaseHandbrake();
    putCarInGear();
    drive();
}

protected void onPause() {
    putCarInNeutral();
    applyHandbrake();
}

protected void onStop() {
    switchEveryThingOff();
    turnOffEngine();
    removeSeatBeltAndGetOutOfCar();
    lockCar();
}

protected void onDestroy() {
    enterOfficeBuilding();
}

protected void onReachedGroceryStore(...) {
    Intent i = new Intent(ACTION_GET_GROCERIES, ...,  this, GroceryStoreActivity.class);
}

protected void onRestart() {
    unlockCarAndGetIn();
    closeDoorAndPutOnSeatBelt();
    putKeyInIgnition();
}

자, 그것은 또 다른 긴 것입니다 (죄송합니다). 그러나 여기 내 설명이 있습니다 ...

onResume()내가 운전을 시작할 때이고 onPause()일시적으로 멈출 때입니다. 그래서 나는 운전을하다가 빨간불에 도달하여 잠깐 멈춘다. 또 다른 빨간불과 나는 잠시 멈췄다가 다시 녹색을 resume 다 onPause() -> onResume() -> onPause() -> onResume()루프는 꽉 하나이며 나의 여행을 통해 여러 번 발생합니다.

재시작을 통해 다시 멈추는 것 (내 여행을 준비하기 위해)에서 다시 시작하는 루프는 덜 일반적입니다. 어떤 경우에는, 나는 식료품 점을 발견하고 GroceryStoreActivity가 시작됩니다 (내 DriveToWorkActivity지점으로 강제 onStop()). 내가 가게에서 돌아 오면, 나는 통과 onRestart()하고 onStart()다음 내 여행을 다시 시작합니다.

나는에있어 코드를 넣을 수있는 onStart()양에 onCreate()onRestart()및 대체 할 귀찮게하지 onStart()요구 사이에 수행 할 수있는보다 전혀하지만 onCreate() -> onResume()하고 onRestart() -> onResume(), 더 내가 복제있어 일을.

다시 한 번 인용하면 ...

왜 onStart ()를 제외하고 onRestart () 및 onCreate () 메소드 후에 onResume ()이 호출 될 수 없습니까?

재정의하지 않으면 onStart()이것이 실제로 발생합니다. 의 onStart()메소드는 Activity암시 적으로 호출 되지만 코드의 효과는 실제로 onCreate() -> onResume()또는 onRestart() -> onResume()입니다.


이 둘 것을 의미 onCreate()하고 onRestart()오른쪽 공통 코드를 많이 공유 할 것인가?
Dheeraj Vepakomma

1
@Dheeraj : 반드시 그런 것은 아닙니다. 이것은 의사 코드이며 Activity수명주기 의 각 단계가 어떻게 사용되는지 보여 주기위한 것입니다. 생성 단계 onCreate(...)는 인스턴스 멤버 (UI 요소 등)를 인스턴스화 할 때 많은 작업을 수행 할 수 있지만 '다시 시작'할 필요는 없습니다. 실제로 많은 사람들이 Activities정말 이상 구현할 필요가 없습니다 onCreate(...), onResume()그리고 onPause()다른 방법은 다른 일을해야 할 수도 있습니다 경우에 사용할 수 있으며, 키가 어디에 코드를 삽입하는 이해하는 것입니다.
Squonk

1
이것이 iOS와 심지어 WP7에 비해 Android API를 싫어하게 된 이유입니다. 나는 C #에서 세 가지 모두에서 실행되는 게임을 만들었고 Google과 Android에 크게 실망했다고 말해야합니다. 언어 / API 디자인 부서에는 부족한 것 같습니다. 나는 다른 리눅스 폰 OS가 대체하기를 바란다. cuz 나는 일반적으로 오픈 소스에 투표를한다 ...
zezba9000

2
@Tim : 좋아, 더 나은 디자인을 생각해 냈어. 누군가가 앱 (앱)을 사용하고 갑자기 전화를받을 때 휴대 전화 시나리오를 어떻게 처리 하시겠습니까? 앱 디자이너는 Activity라이프 사이클 메소드를 명시 적으로 호출하지 않습니다 .Android OS는 그것을 수행하고 매우 효율적으로 수행합니다 (앱 개발자가 수행중인 작업을 알고 있고 코드를 효율적으로 알고 있다고 가정). 많은 안드로이드 개발을한다면 왜 일이 그 방식대로 작동하는지 알게 될 것입니다. 100 % 완벽하지는 않지만 꽤 좋습니다.
Squonk

9
아래의 Nilesh의 답변이 훨씬 명확하다고 생각합니다. 주요 차이점 onStartonResume그 '공개'및 '사용자 상호 작용'이다. 이 차량 운전 은유는 혼란스럽고 실제로 도움이되지 않습니다.
KJ

142

짧은 답변:

활동이 사용자에게 "보이게"되는 상태이기 때문에 onStart 없이는 살 수 없지만, 사용자가 활동과 "상호 작용"할 수는 없지만 다른 작은 대화 상자와 겹칠 수 있습니다. 사용자와 상호 작용하는이 기능은 onStart와 onResume을 차별화하는 기능입니다. 유리문 뒤에있는 사람으로 생각하십시오. 상대방을 볼 수는 있지만 대화 할 수는 없습니다. OnResume은 도어 오프너와 유사하며 상호 작용을 시작할 수 있습니다.

또한 onRestart ()가 가장 적게 이해됩니다. onRestart () 대신 onStop () 후에 onStart () 또는 onResume ()으로 직접 이동하지 않는 이유에 대한 질문을 할 수 있습니다. 작성 부분을 생략하면 onRestart ()가 onCreate ()와 부분적으로 동일하다는 것을 이해하면 이해하기 쉬워집니다. 기본적으로 두 상태 모두 onStart ()로 이어집니다 (즉, 활동이 표시됨). 따라서 두 상태 모두 표시 할 항목을 "준비"해야합니다. OnCreate는 표시 할 항목을 "생성"해야 할 추가 책임이 있습니다.

따라서 그들의 코드 구조는 다음과 같이 맞을 수 있습니다 :

onCreate()
{
     createNecessaryObjects();

     prepareObjectsForDisplay();
}


onRestart()
{
     prepareObjectsForDisplay();

}

Google이 다음과 같은 것이 아닌 직관적이지 않은 이름을 선택했기 때문에 전체 혼란이 발생합니다.

onCreateAndPrepareToDisplay()   [instead of onCreate() ]
onPrepareToDisplay()            [instead of onRestart() ]
onVisible()                     [instead of onStart() ]
onBeginInteraction()            [instead of onResume() ]
onPauseInteraction()            [instead of onPause() ]
onInvisible()                   [instead of onStop]
onDestroy()                     [no change] 

활동 다이어그램은 다음과 같이 해석 될 수 있습니다.

안드로이드 활동 수명주기


4
학생들에게 설명 할 때 onStop () 대신 maybeOnInvisible ()을 사용합니다. 그리고 onDestroy () 대신 maybeOnDestroy ()를 사용하십시오. 이 이름은 내가 찾은 설명으로 잘 작동합니다. 나는 구글이 실제로 이러한 이름으로 바꾸고 싶지는 않다고 생각했다.
Stephan Branczyk

당신의 제안 이름처럼 나는, 그들은 수 있도록 도와 일부 말도 안되는 안드로이드 API의이 부분의 감각을. 여전히 수명주기에 대한 일반적인 질문이 있습니다. 모든 다이어그램에는 onPause에서 onResume으로 직접 연결되는 경로가 표시됩니다. 나는 어떤 경우에도 그 길을 실제로 본 적이 있다고 생각하지 않습니다. 항상 onStop에서 onStart까지의 경로를 사용합니다. 다른 경로를 유발하는 요인은 무엇입니까?
듀이 보젤

@StephanBranczyk 왜 ... ()를 사용합니까? 왜 "아마도"?
Marian Paździoch

1
@Damnum, 활동 수명주기에 대한 최신 설명을 보려면 Google에서 만든 중급 Android Udacity 과정을 확인하시기 바랍니다. 시험 버튼 (나노도 버튼)이 아니라 파란색 버튼을 클릭하여 재료에 무료로 액세스한다고 가정하면 무료입니다. udacity.com/course/developing-android-apps--ud853
Stephan Branczyk

1
@Damnum, 시청 한 비디오와 관련된 udacity 포럼에서 해당 질문을하는 것이 좋습니다. 그러나 기본적으로 대화 상자 활동인지 대화 상자인지에 관계없이 사용중인 대화 상자에 달려 있다고 생각합니다.
Stephan Branczyk

29

onStart()활동이 사용자에게 표시 될 때 호출됩니다. onResume()활동이 사용자와 상호 작용을 시작할 때 호출됩니다. 이 경우 다른 작업을 수행 할 수 있습니다.

참조 링크 참조합니다.



10

"Hello, Android, Google의 모바일 개발 플랫폼 소개"책은 Android 앱의 수명주기에 대한 좋은 설명을 제공합니다. 운좋게도 그들은 특정 장을 온라인으로 발췌 한 것입니다. http://media.pragprog.com/titles/eband3/concepts.pdf 에서 39 페이지의 그래픽을 참조하십시오 .

그건 그렇고,이 책은 안드로이드 초보자에게 적극 권장됩니다!


2
좋은 이미지와 좋은 책이지만 여전히 onStart () 메소드가 필요한 이유와 onResume ()에서는 할 수없는 특별한 일에 대한 대답을 제공하지 않습니다.
Eugene

8
앱이 일시 중지 된 경우 onStart ()가 호출되지 않습니다. 다른 앱이 포커스를 얻지 만 앱을 완전히 가리지 않는 경우 앱이 "일시 중지되었습니다". 따라서 "중지됨"상태에서 "중지됨"상태와 다른 작업을 수행 할 수 있습니다. 따라서 앱이 일시 중지 된 상태에서 "재개"된 경우 앱이 중지 된 상태 또는 전체 시작에서 "시작된"경우와는 다른 작업을 수행 할 수 있습니다. 도움이 되나요?
Martin Booka Weser

7

특히 까다로운 예는를 사용하여 활동에서 관리되는 대화 상자를 표시하기로 결정한 경우 showDialog()입니다. 대화 상자가 열린 상태에서 사용자가 화면을 회전하면 (이를 "구성 변경"이라고 함) 기본 활동은 모든 종료 수명주기 호출을 통해 l까지 onDestroy()진행하고 다시 생성 된 다음 라이프 사이클을 통해 다시 진행됩니다. 그러나 예상하지 못한 것은 onCreateDialog()onPrepareDialog()( showDialog()관리 대화 상자이므로 대화 상자를 자동으로 다시 만들 때 다시 호출되는 메소드 ) 와 사이 에 호출 됩니다. 여기서 중요한 점은 대화 상자가 전체 화면을 덮지 않으므로 주 활동의 일부를 볼 수 있다는 것입니다. 세부 사항이지만 중요합니다!onStart()onResume()


7

onStart()

  1. onCreate (Bundle) 이후 또는 onRestart () 이후에 onResume () 뒤에 호출됩니다. 됩니다.
  2. 당신은 BroadcastReceiver에 등록 할 수 있습니다 onStart()UI에 영향을주는 변경 사항을 모니터링하기 위해 . onStop ()에서 등록을 해제해야합니다.
  3. 파생 클래스는 수퍼 클래스의이 메소드 구현을 호출해야합니다. 그렇지 않으면 예외가 발생합니다.

onResume()

  1. onRestoreInstanceState (Bundle), onRestart () 또는 onPause () 이후에 호출
  2. 애니메이션 시작, 독점 액세스 장치 (예 : 카메라) 열기

onStart() 일반적으로 반환 값이 다음과 같은 백그라운드 스레드로 작업을 발송합니다.

  • START_STICKY 를 종료하면 자동으로 다시 시작하여 활성 상태로 유지합니다.

  • START_REDELIVER_INTENT stopSelf () 전에 서비스가 종료 된 경우 자동으로 다시 시작하고 다시 시도하십시오.

onResume()장치가 휴면 상태가 된 후 또는 경고 또는 다른 부분 화면 하위 활동이 이전 창의 일부를 볼 수 있도록 한 후 OS에서 호출하므로 메소드에서 필드를 다시 초기화해야합니다 ). 그러한 상황은 onStop()아이가 닫힐 때 호출 되지 않습니다 .

onResume()onStart()활동이 백그라운드에서 재개 될 때 없이 호출 됩니다.

자세한 내용은 Android_activity_lifecycle_gotchaActivity Lifecycle을 방문하십시오.


내 앱이 백그라운드로 갈 때 실제로 중지됩니다
deadfish

5

잘만되면 간단한 설명 :-

onStart () -> 활동이 표시 될 때 호출되지만 포 그라운드에 없을 수 있습니다 (예 : AlertFragment가 맨 위에 있거나 다른 가능한 사용 사례).

onResume () -> 활동이 포 그라운드에 있거나 사용자가 활동과 상호 작용할 때 호출됩니다.


4

onStart() 방법 Activity 표시 상태에 들어가 레이아웃 생성 아니라 상호 작용이 활성 레이아웃 할 수있다.

Resume() 이제 활동 레이아웃과 상호 작용할 수 있습니다.


1

onStart () 및 onResume () 호출 사이에 발생하는 사항이 있습니다. 즉, onNewIntent ()는 고통스럽게 알게되었습니다.

SINGLE_TOP 플래그를 사용 중이고 인 텐트 엑스트라를 사용하여 일부 데이터를 액티비티에 전송하는 경우 onStart () 이후 및 onResume () 전에 호출되는 onNewIntent ()에서만 액세스 할 수 있습니다 . 따라서 일반적으로 엑스트라에서 새 데이터를 가져 와서 일부 클래스 멤버로 설정하거나 setIntent ()를 사용하여 새 의도를 원래 활동 의도로 설정하고 onResume ()에서 데이터를 처리합니다.


0

http://developer.android.com/training/basics/activity-lifecycle/starting.html에 대한 참조

onResume()활동이 사용자와의 상호 작용을 시작하기 직전에 호출됩니다. 이 시점에서 액티비티는 액티비티 스택의 맨 위에 있으며 사용자 입력은 액티비티입니다. 항상 뒤에 onPause().

onPause()시스템이 다른 활동을 재개하려고 할 때 호출됩니다. 이 방법은 일반적으로 저장하지 않은 변경 사항을 영구 데이터에 커밋하고 애니메이션 및 CPU를 소비 할 수있는 기타 사항을 중지하는 데 사용됩니다. 다음 활동이 다시 시작될 때까지 재개되지 않으므로 매우 빠르게 수행해야합니다. 에 의해 하나 이어 onResume()활동 반환, 전면에 백업하는 경우 또는으로 onStop()는 사용자에게 보이지하게합니다.


0

이것이 답변으로 간주되는지 확실하지는 않지만 여기에 Google 코스의 YouTube 비디오 (Kotlin을 사용하여 Android 앱 개발)가 있습니다.

  • 활동이 표시 되면 시작시 호출
  • On Pause는 활동 이 포커스를 잃을 때 호출됩니다 (대화 상자가 나타나는 것처럼).
  • On Resume은 활동에 포커스가 있을 때 호출됩니다 (예 : 대화 상자가 사라지는 경우).
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.