안드로이드 문서 http://developer.android.com/reference/android/app/Activity.html 에서 '활동이 포 그라운드로 온다'가 호출 onPause()
하고 '활동이 더 이상 보이지 않습니다'라고 전화했습니다 onStop()
.
'활동이 더 이상 보이지 않습니다'와 같은 '활동이 포 그라운드로 나오지 않습니까?' 그들 사이의 차이점이 무엇인지 말씀해 주시겠습니까?
안드로이드 문서 http://developer.android.com/reference/android/app/Activity.html 에서 '활동이 포 그라운드로 온다'가 호출 onPause()
하고 '활동이 더 이상 보이지 않습니다'라고 전화했습니다 onStop()
.
'활동이 더 이상 보이지 않습니다'와 같은 '활동이 포 그라운드로 나오지 않습니까?' 그들 사이의 차이점이 무엇인지 말씀해 주시겠습니까?
답변:
아니요, 일부 활동이 포 그라운드에 있다고해서 반드시 다른 활동이 완전히 보이지 않는 것은 아닙니다. 다음과 같은 경우를 고려하십시오.
여기서 우리는 두 활동을 동시에 볼 수 있습니다. 필드가있는 첫 번째 활동은 다른 활동에 의해 가려져서 사용자는 더 이상 상호 작용할 수 없습니다. 그러나 모든 결과로 여전히 볼 수 있습니다.
그것은 어떤 활동이 완전히 불투명하고 전체 화면을 덮고 있는지 아닌지에 대한 질문을 남깁니다. 이 결정은 활동이 포함 된 창을 기반으로합니다. 창에 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);
onPause()
및 onStop()
. 100 %입니까? 이전 액티비티에서 하나의 픽셀 만 보이는 경우에도 여전히 onPause()
있습니까?
onPause()
대화 상자가 표시되면 응용 프로그램 에서 전혀 호출되지 않습니다. 홈 버튼을 onPause()
누를 때만 호출됩니다 . 이것이 어떻게 가능한지?
여전히 그 일부를 볼 수 있다면 ( Activity
전면에 오면 전체 화면을 차지하지 않거나 다소 투명합니다) onPause()
호출됩니다. 당신이 그것의 일부를 볼 수없는 경우, onStop()
호출됩니다.
예를 들어 대화 상자 **는 이전의 전체 내용 Activity
을 다루지 않을 수 있으며,이 때가 onPause()
호출 될 때입니다 .
** 여기서는 Android 대화 상자를 말하는 것이 아니라 사용자 화면의 일부만 나타나고 모호하게하는 것에 대한 개념적 아이디어입니다. 이 메모는 아래 @GMsoF의 의견을 바탕으로 명확하게하기 위해 추가되었습니다.
Dialog
Android 클래스에서와 같이 생각한다고 생각 합니다. 그러나 내가 얻은 Activity
것은 모든 새로운 Activity
것이 이전의 것을 완전히 덮을 필요는 없다는 생각을 설명하기 위해 처음으로 부분적으로 모호한 것입니다 .
포 그라운드에 있다는 것은 액티비티에 입력 포커스가 있음을 의미합니다. 예를 들어 활동이 표시되지만 포커스가있는 대화 상자에 의해 부분적으로 가려 질 수 있습니다. 이 경우에는 onPause()
호출되지만 호출되지는 않습니다 onStop()
. 대화 상자가 사라지면 액티비티의 onResume()
메소드가 호출됩니다 (그러나 아님 onStart()
).
onPause()
장치가 절전 모드로 전환되거나 대화 상자가 나타날 때 호출됩니다 . " 그러나이 스레드 가 명확하기 때문에 대화 상자가 반드시 활동이 일시 중지되었음을 의미 하지는 않습니다 (예 : 대화 상자로 표시된 활동 이더라도 ).
실제로 “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 이전 활동은 완전히 새로운 활동에 의해 덮여 : 모두 onPause
와 onStop
호출됩니다
---- 몇 가지 메모를 작성하는 것이 좋습니다.
비고 1 : 대화가 활동의 상단에서 시작되는 경우 NONE의 onPause
또는 onStop
호출되지 않습니다.
참고 2 : 테마가 대화 상자로 설정된 활동이 정상 동작과 같습니다.
참고 3 : 마시맬로가 발생하기 때문에 권한 대화 상자와 같은 시스템 대화 상자가 나타납니다 onPause
.
예, 이해하려고 노력하며 아래에서 설명 할 수 있습니다.
활동 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;
}
}
}
나는 이것이 분명하기를 바랍니다
paused
활동이 완전히 활성화 됩니다 (모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됨).stopped
활동은 모든 상태와 멤버 정보를 유지하지만 더 이상 첨부되지 않습니다window manager
.