Android Activites의 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);
여전히 그 일부를 볼 수 있다면 ( 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
'Programming' 카테고리의 다른 글
HATEOAS (REST 아키텍처)에 대한 실제 예 (0) | 2020.06.22 |
---|---|
macOS에서 Git을 최신 버전으로 업그레이드하는 방법은 무엇입니까? (0) | 2020.06.22 |
이 서비스를 사용할 권한이 없습니다 iTunes 앱 업로드 오류 (0) | 2020.06.22 |
drawRect 또는 drawRect하지 않기 (drawRect / Core Graphics를 서브 뷰 / 이미지와 왜 사용해야 하는가?) (0) | 2020.06.22 |
flexbox 항목이 열 모드로 줄 바꿈 될 때 컨테이너의 너비가 커지지 않습니다 (0) | 2020.06.22 |