Android Activites의 onPause ()와 onStop ()의 차이점은 무엇입니까?


149

안드로이드 문서 http://developer.android.com/reference/android/app/Activity.html 에서 '활동이 포 그라운드로 온다'가 호출 onPause()하고 '활동이 더 이상 보이지 않습니다'라고 전화했습니다 onStop().

'활동이 더 이상 보이지 않습니다'와 같은 '활동이 포 그라운드로 나오지 않습니까?' 그들 사이의 차이점이 무엇인지 말씀해 주시겠습니까?


17
훌륭한 질문은 +1입니다. 또한 paused활동이 완전히 활성화 됩니다 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됨). stopped활동은 모든 상태와 멤버 정보를 유지하지만 더 이상 첨부되지 않습니다 window manager.
ateiob

답변:


107

아니요, 일부 활동이 포 그라운드에 있다고해서 반드시 다른 활동이 완전히 보이지 않는 것은 아닙니다. 다음과 같은 경우를 고려하십시오.

테마 Theme.Dialog가있는 활동

여기서 우리는 두 활동을 동시에 볼 수 있습니다. 필드가있는 첫 번째 활동은 다른 활동에 의해 가려져서 사용자는 더 이상 상호 작용할 수 없습니다. 그러나 모든 결과로 여전히 볼 수 있습니다.

그것은 어떤 활동이 완전히 불투명하고 전체 화면을 덮고 있는지 아닌지에 대한 질문을 남깁니다. 이 결정은 활동이 포함 된 창을 기반으로합니다. 창에 windowIsFloating또는 플래그가있는 경우 windowIsTranslucent활동이 기본 항목을 표시하지 않는 것으로 간주됩니다. 그렇지 않으면 onStop()호출되어 호출됩니다. 관련 코드는 다음에서 찾을 수 있습니다 com.android.server.am.ActivityRecord.

fullscreen = ent != null && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsFloating, false)
        && !ent.array.getBoolean(
        com.android.internal.R.styleable.Window_windowIsTranslucent, false);

10
부분적 대비 전체적 가시성에 중점을 두어 설명을 +1합니다. 안드로이드 사이에서 결정하게 화면의 임계 값 비율을 알고 흥미로운 일이 될 것입니다 onPause()onStop(). 100 %입니까? 이전 액티비티에서 하나의 픽셀 만 보이는 경우에도 여전히 onPause()있습니까?
ateiob

3
@ateiob 그것은 어디에도 언급되지 않지만 그렇게 생각합니다. 그러나 전체 화면을 채우지 않는 대부분의 활동은 시스템에서 제공하는 스타일 중 하나를 대화 상자에 사용하기 때문에 일반적으로 분명합니다.
Malcolm

1
이상하지만 onPause()대화 상자가 표시되면 응용 프로그램 에서 전혀 호출되지 않습니다. 버튼을 onPause()누를 때만 호출됩니다 . 이것이 어떻게 가능한지?
ateiob

이것이 정답이어야합니다. 그건 그렇고, 전경은 대화 또는 활동입니까?
GMsoF September

3
@GMsoF 활동. 이것이 핵심입니다. 모든 대화가 실제로 대화는 아닙니다. 활동을 대화 상자처럼 보이게 만들 수 있으므로 실제로 전체 화면보다 작습니다.
Malcolm

38

여전히 그 일부를 볼 수 있다면 ( Activity전면에 오면 전체 화면을 차지하지 않거나 다소 투명합니다) onPause()호출됩니다. 당신이 그것의 일부를 볼 수없는 경우, onStop()호출됩니다.

예를 들어 대화 상자 **는 이전의 전체 내용 Activity을 다루지 않을 수 있으며,이 때가 onPause()호출 될 때입니다 .

** 여기서는 Android 대화 상자를 말하는 것이 아니라 사용자 화면의 일부만 나타나고 모호하게하는 것에 대한 개념적 아이디어입니다. 이 메모는 아래 @GMsoF의 의견을 바탕으로 명확하게하기 위해 추가되었습니다.


33
아니. 오해의 소지가 있습니다. 대화 상자는 현재 활동의 컨텍스트를 사용하기 때문에 onPause ()를 호출하지 않습니다. 활동이 살아있는 것으로 간주하십시오.
GMsoF September

6
@GMsoF 대화 상자를 들었을 때 DialogAndroid 클래스에서와 같이 생각한다고 생각 합니다. 그러나 내가 얻은 Activity것은 모든 새로운 Activity것이 이전의 것을 완전히 덮을 필요는 없다는 생각을 설명하기 위해 처음으로 부분적으로 모호한 것입니다 .
nicholas.hauschild 21시

11

포 그라운드에 있다는 것은 액티비티에 입력 포커스가 있음을 의미합니다. 예를 들어 활동이 표시되지만 포커스가있는 대화 상자에 의해 부분적으로 가려 질 수 있습니다. 이 경우에는 onPause()호출되지만 호출되지는 않습니다 onStop(). 대화 상자가 사라지면 액티비티의 onResume()메소드가 호출됩니다 (그러나 아님 onStart()).


5
대화 내용이 잘못 될 수 있습니다. 이 활동의 ​​기본 UI 스레드에서 경고 대화 상자가 팝업되면이 경우 onPause ()가 호출되지 않습니다. 이 대화 상자가 다른 활동 또는 다른 앱에서 팝업 된 경우에만 해당됩니다.
Sam003

1
@Zhisheng-귀하의 의견에 동의합니다. 방금 Activites 안내서 주제를 설명하고 있습니다 . " onPause()장치가 절전 모드로 전환되거나 대화 상자가 나타날 때 호출됩니다 . " 그러나이 스레드 가 명확하기 때문에 대화 상자가 반드시 활동이 일시 중지되었음을 의미 하지는 않습니다 (예 : 대화 상자로 표시된 활동 이더라도 ).
Ted Hopp

9

실제로 “onPause ()”“onPause () + onStop ()”차이점을 고려해야합니다 .

새로운 활동이 발생할 때마다 화면의 일부 공간을 차지합니다. 따라서 이전에 실행중인 활동은 여전히 ​​어느 정도 볼 수 있습니다. 이 경우 이전에 실행중인 활동은 Back Stack으로 푸시되지 않습니다. 따라서 여기서는 onPause () 메소드 만 호출 됩니다.

반면에 일부 새로운 활동이 발생하고 전체 화면을 차지하면 이전에 실행중인 활동이 사라집니다. 이 경우 이전에 실행중인 활동이 Back Stack으로 이동됩니다. 여기서 onPause () + onStop ()이 호출됩니다.

요약하기

onPause () -화면이 부분적으로 다른 새로운 활동으로 덮여 있습니다. 액티비티가 백 스택으로 이동되지 않습니다.

onPause () + onStop () -화면이 다른 새로운 활동으로 완전히 덮여 있습니다. 액티비티가 백 스택으로 이동됩니다.

백 스택에 대해 자세히 알아보십시오 .


0

간결한 말로 :

onStop()다른 활동이 표시 될 때 이전 활동 라이프 사이클 메소드 중 하나가 호출됩니다. 활동 맨 위에 대화가 onPause()있으면 호출됩니다.

참고 : 활동은 전체 화면을 채우는 구성 요소입니다.

참고 : 대화는 화면을 완전히 채우지 않으므로 활동이 아닙니다.


0

onPause 및 onStop 메소드에 많은 문제가 발생했기 때문에 세 가지 시나리오가 사라졌습니다
.-1 . 최근 앱 버튼을 클릭하면 수명주기 메소드가 호출되지 않지만 onWindowFocusChanged (boolean hasFocus)는 hasFocus 값으로 호출됩니다. 거짓으로 전달되었습니다. 5 이전의 Android 버전에서는 최근 앱 버튼을 누르면 onPause 메소드가 호출되었습니다.

2. Malcolm 에서 언급 한 것처럼 활동과 같은 팝업이 활동 위에 나타나면 onPause 버튼이 호출됩니다. 전체 화면을 차지하는 새 활동이 호출되면 이전 활동에서 onStop이 호출됩니다. Android 권한 대화 상자 는 활동이 onPause를 호출하도록합니다.

삼.활동 시간이 초과되면 onPause가 호출됩니다. 언젠가 화면을 열지 않으면 onStop이 호출됩니다.

또한 ateiob 이 언급 한 답변 중 하나를 중요하게 생각 합니다.

일시 정지 된 활동이 완전히 활성 상태입니다 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됨). 중지 된 활동은 모든 상태 및 구성원 정보를 유지하지만 더 이상 창 관리자에 첨부되지 않습니다


도움이 되길 바랍니다.


0

새로운 활동이 시작될 때마다 onPause어떤 상황에서도 이전 활동 이 도전적으로 부를 것입니다.

실제로 두 가지 상황이 있습니다.

1- 이전 활동의 일부가 표시되거나 새 활동이 투명합니다. onPause호출 만 됩니다.

2 이전 활동은 완전히 새로운 활동에 의해 덮여 : 모두 onPauseonStop호출됩니다

---- 몇 가지 메모를 작성하는 것이 좋습니다.

비고 1 : 대화가 활동의 상단에서 시작되는 경우 NONE의 onPause또는 onStop호출되지 않습니다.

참고 2 : 테마가 대화 상자로 설정된 활동이 정상 동작과 같습니다.

참고 3 : 마시맬로가 발생하기 때문에 권한 대화 상자와 같은 시스템 대화 상자가 나타납니다 onPause.


-5

예, 이해하려고 노력하며 아래에서 설명 할 수 있습니다.

활동 A와 활동 B의 두 가지 활동이 있습니다.

public class ActivityA extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
}

private void initialize() {
    Log.i("Activity A", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity A", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity A", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity A", "onResume");
}

@Override
protected void onPause() {
    super.onPause();
    Log.i("Activity A", "onPause");
}

@Override
protected void onStop() {
    super.onStop();
    Log.i("Activity A", "onStop");
}

@Override
protected void onDestroy() {
    super.onDestroy();
    Log.i("Activity A", "onDestroy");
}

@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        Intent activityB = new Intent(this, ActivityB.class);
        startActivity(activityB);
        break;
    default:
        break;
    }
}

여기에 활동 B가 있습니다. 코드에서 내 의견을 따르십시오.

public class ActivityB extends Activity implements OnClickListener {

// button
private Button mBtnChangeActivity;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_a);
    initialize();
    setEvent();
    // if call finish() here, activityA will don't stop, just pause
    // Activity A will call onStop() when Activity B call onStart() method
    finish();
}

private void initialize() {
    Log.i("Activity B", "Initialize()");
    mBtnChangeActivity = (Button) findViewById(R.id.btn_change_activity);
}

private void setEvent() {
    Log.i("Activity B", "setEvent()");
    mBtnChangeActivity.setOnClickListener(this);
}

@Override
protected void onStart() {
    super.onStart();
    Log.i("Activity B", "onStart");
}

@Override
protected void onResume() {
    super.onResume();
    Log.i("Activity B", "onResume");
}


@Override
public void onClick(View v) {
    switch (v.getId()) {
    case R.id.btn_change_activity:
        finish();
        break;
    default:
        break;
    }
}
}

나는 이것이 분명하기를 바랍니다


항상 그 차종의 의미를 설명하려고
알렉산더 Zaldostanov에게
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.