Programming

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

procodes 2020. 6. 22. 22:04
반응형

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


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

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


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

테마 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);

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

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

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


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


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

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

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

요약하기

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

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

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


간결한 말로 :

onStop()다른 활동이 표시되면 이전 활동 수명주기 메소드 중 하나가 호출됩니다. 활동 맨 위에 대화가 onPause()있으면 호출됩니다.

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

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


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

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

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

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

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


도움이 되길 바랍니다.


새로운 활동이 시작될 때마다 onPause어떤 상황에서도 이전 활동 이 도전적으로 불려집니다.

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

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

2- previous activity is completely covered by new activity: both onPause and onStop will be called

----Good to state some notes:

NOTE 1: if a dialog starts on top of an activity NONE of onPause or onStop will be called.

NOTE 2: if its an Activity whose theme is set to a dialog, the behavior will be just like a normal activity.

NOTE 3: apparently a system dialog like permission dialog since marshmallow will cause onPause.


Yeap, I try to understand and I can explain this below:

There are 2 activities: ActivityA & ActivityB

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;
    }
}

Here is activity B. Follow my comment in code

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;
    }
}
}

I hope this is clearly

참고URL : https://stackoverflow.com/questions/9266417/what-is-the-difference-between-onpause-and-onstop-of-android-activites

반응형