Android 활동의 수명주기는 무엇입니까? 왜 그렇게 많은 유사한 소리가 나는 방법 (있다 onCreate()
, onStart()
, onResume()
) 초기화 중에 호출, 그래서 많은 사람들이 ( onPause()
, onStop()
, onDestroy()
) 끝에서 호출?
이러한 메소드는 언제 호출되며 어떻게 올바르게 사용해야합니까?
Android 활동의 수명주기는 무엇입니까? 왜 그렇게 많은 유사한 소리가 나는 방법 (있다 onCreate()
, onStart()
, onResume()
) 초기화 중에 호출, 그래서 많은 사람들이 ( onPause()
, onStop()
, onDestroy()
) 끝에서 호출?
이러한 메소드는 언제 호출되며 어떻게 올바르게 사용해야합니까?
답변:
Activity Lifecycle (Android 개발자)에서 참조하십시오 .
활동이 처음 작성 될 때 호출됩니다. 뷰를 생성하고,리스트에 데이터를 바인딩하는 등의 일반적인 정적 설정을 모두 수행해야합니다.이 방법은 활동의 이전에 정지 된 상태 (있는 경우)를 포함하는 번들도 제공합니다. 항상 onStart ()가 뒤 따릅니다.
활동이 다시 시작되기 전에 중지 된 후에 호출됩니다. 항상 onStart ()
활동이 사용자에게 표시 될 때 호출됩니다. 활동이 포 그라운드로 온 경우 onResume ()이 뒤 따릅니다.
활동이 사용자와 상호 작용을 시작할 때 호출됩니다. 이 시점에서 활동은 활동 스택의 맨 위에 있으며 사용자 입력이 진행됩니다. 항상 onPause ()가 뒤 따릅니다.
활동이 백그라운드로 진행되지만 아직 종료되지 않은 경우 활동 라이프 사이클의 일부로 호출됩니다. onResume ()에 해당합니다. 액티비티 B가 액티비티 A 앞에서 시작되면이 콜백이 A에서 호출됩니다. A의 onPause ()가 반환 될 때까지 B는 생성되지 않으므로 여기에서 긴 작업을 수행하지 마십시오.
더 이상 사용자에게 보이지 않을 때 호출됩니다. 다음 사용자 활동에 따라 onRestart (), onDestroy () 또는 아무것도 수신하지 않습니다. onPause () 메소드를 호출 한 후 활동 프로세스를 계속 실행할 수있는 메모리가 부족한 메모리가 부족한 상황에서는이 메소드를 호출 할 수 없습니다.
활동이 종료되기 전에받는 마지막 전화. 이것은 활동이 완료되거나 (finish ()라고하는 누군가가 시스템이 공간을 절약하기 위해 활동의이 인스턴스를 일시적으로 파괴하고 있기 때문에 발생할 수 있습니다. isFinishing () 메소드로 두 시나리오를 구별 할 수 있습니다.
활동이 처음로드 되면 다음과 같이 이벤트가 호출됩니다.
onCreate()
onStart()
onResume()
이 때 전화 버튼을 클릭 활동은 백그라운드로 이동 및 이벤트 아래가 호출된다 :
onPause()
onStop()
전화 걸기를 종료하면 아래 이벤트가 호출됩니다.
onRestart()
onStart()
onResume()
뒤로 버튼 을 클릭하거나 finish () 시도 하면 활동이 다음과 같이 호출됩니다.
onPause()
onStop()
onDestroy()
Android OS는 우선 순위 대기열을 사용하여 기기에서 실행중인 활동 관리를 지원합니다. 특정 Android 활동의 상태에 따라 OS 내에서 특정 우선 순위가 지정됩니다. 이 우선 순위 시스템은 Android가 더 이상 사용하지 않는 활동을 식별하여 OS가 메모리와 자원을 회수 할 수 있도록합니다. 다음 다이어그램은 활동 중에 수행 할 수있는 상태를 보여줍니다.
이러한 상태는 다음과 같이 세 가지 주요 그룹으로 나눌 수 있습니다.
활성 또는 실행 중 -활동이 활동 스택의 상단이라고도하는 포 그라운드에있는 경우 활성 또는 실행중인 것으로 간주됩니다. 이것은 Android 활동 스택에서 최우선 순위 활동으로 간주되며, 활동이 기기에서 사용 가능한 것보다 많은 메모리를 사용하려고 시도하는 경우와 같이 극단적 인 상황에서만 OS에 의해 종료됩니다. 응답하지 않습니다.
일시 중지됨 -기기가 절전 모드로 전환되거나 활동이 여전히 보이지만 크기가 작거나 투명한 새 활동에 의해 부분적으로 숨겨지면 활동이 일시 중지 된 것으로 간주됩니다. 일시 중지 된 활동은 여전히 활성 상태입니다. 즉, 모든 상태 및 구성원 정보를 유지하고 창 관리자에 연결된 상태로 유지됩니다. 이는 Android 활동 스택에서 두 번째로 우선 순위가 높은 활동으로 간주되며,이 활동을 종료하면 활동 / 실행 활동을 안정적이고 반응 적으로 유지하는 데 필요한 자원 요구 사항을 충족시키는 경우에만 OS에서 종료됩니다.
중지됨 -다른 활동에 의해 완전히 가려진 활동은 중지되었거나 백그라운드에있는 것으로 간주됩니다. 중지 된 활동은 여전히 가능한 한 오랫동안 상태 및 구성원 정보를 유지하려고 시도하지만 중지 된 활동은 세 상태 중 가장 낮은 우선 순위로 간주되므로 OS는 자원 요구 사항을 충족시키기 위해 먼저이 상태에서 활동을 종료합니다. 우선 순위가 높은 활동
* 수명주기를 이해하기위한 샘플 활동 **
import android.app.Activity;
import android.os.Bundle;
import android.util.Log;
public class MainActivity extends Activity {
String tag = "LifeCycleEvents";
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
Log.d(tag, "In the onCreate() event");
}
public void onStart()
{
super.onStart();
Log.d(tag, "In the onStart() event");
}
public void onRestart()
{
super.onRestart();
Log.d(tag, "In the onRestart() event");
}
public void onResume()
{
super.onResume();
Log.d(tag, "In the onResume() event");
}
public void onPause()
{
super.onPause();
Log.d(tag, "In the onPause() event");
}
public void onStop()
{
super.onStop();
Log.d(tag, "In the onStop() event");
}
public void onDestroy()
{
super.onDestroy();
Log.d(tag, "In the onDestroy() event");
}
}
활동에는 6 가지 상태가 있습니다
활동 수명주기 에는 7 가지 방법이 있습니다.
onCreate()
onStart()
onResume()
onPause()
onStop()
onRestart()
onDestroy()
상황
앱을 열 때
onCreate() --> onStart() --> onResume()
뒤로 버튼을 누르고 앱을 종료하면
onPaused() -- > onStop() --> onDestory()
홈 버튼을 눌렀을 때
onPaused() --> onStop()
최근 작업 목록에서 앱을 다시 열거 나 아이콘을 클릭하면 홈 버튼을 누른 후
onRestart() --> onStart() --> onResume()
알림 표시 줄에서 다른 앱을 열거 나 설정을 열 때
onPaused() --> onStop()
다른 앱 또는 설정에서 뒤로 버튼을 누르면 앱을 볼 수 있습니다.
onRestart() --> onStart() --> onResume()
화면에 대화 상자가 열리면
onPause()
대화 상자에서 대화 상자 또는 뒤로 버튼을 닫은 후
onResume()
앱에서 전화가 울리고 사용자
onPause() --> onResume()
사용자가 전화의 응답 버튼을 눌렀을 때
onPause()
통화 종료 후
onResume()
전화기 화면이 꺼져있을 때
onPaused() --> onStop()
화면이 다시 켜질 때
onRestart() --> onStart() --> onResume()
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]
활동 다이어그램은 다음과 같이 해석 될 수 있습니다.
Android 애플리케이션의 수명주기를 관리하는 7 가지 방법이 있습니다.
이 메소드들이 어떤 순서로 호출되는지 아는 것이 왜 사용되는지 명확하게하는 데 도움이되는 간단한 시나리오를 보자.
onCreate()
---> --->onStart()
onResume()
onPause()
---> onStop()
onRestart()
---> --->onStart()
onResume()
onStop()
---> onDestroy()
시작 상태는 다음과 같습니다.
새로운 리눅스 프로세스 생성, 새로운 UI 객체를위한 새로운 메모리 할당 및 전체 화면 설정. 따라서 대부분의 작업이 여기에 포함됩니다.
실행 상태에는 다음이 포함됩니다.
현재 화면에있는 활동 (상태)입니다. 이 상태만으로도 화면에 입력하고 버튼을 터치 및 클릭하는 등의 작업을 처리 할 수 있습니다.
일시 중지 된 상태에는 다음이 포함됩니다.
활동이 포 그라운드에 있지 않고 백그라운드에있는 경우 활동은 일시 정지 상태라고합니다.
중지 된 상태에는 다음이 포함됩니다.
중지 된 활동은 다시 시작해야만 포 그라운드로 구매할 수 있으며 언제든지 파기 할 수도 있습니다.
활동 관리자는 새 활동이 기존 활동에 추가되는 시나리오에서도 사용자 경험과 성능이 항상 최고가되도록 이러한 모든 상태를 처리합니다.
이 질문과 답변이 마음에 들지만 지금까지 onPostCreate () 또는 onPostResume () 과 같이 자주 사용되지 않는 콜백에 대해서는 다루지 않습니다 . Steve Pomeroy는 https://github.com/xxv/android-lifecycle 에서 이를 포함하여 다이어그램과 Android의 Fragment 수명주기 와 관련되는 방법을 시도했습니다 . 활동 부분 만 포함하도록 Steve의 큰 다이어그램을 수정 하고 레터 크기의 한 페이지 출력을 위해 형식을 지정했습니다. https://github.com/code-read/android-lifecycle/blob/master/AndroidActivityLifecycle1.pdf에 텍스트 PDF로 게시 했으며 아래는 이미지입니다.
Android 개발자 페이지에서
onPause () :
시스템이 이전 활동 재개를 시작하려고 할 때 호출됩니다. 이것은 일반적으로 저장되지 않은 변경 사항을 영구 데이터에 커밋하고 애니메이션을 중지하고 CPU를 소비 할 수있는 기타 사항 등을 저지르는 데 사용됩니다.이 메소드의 구현은이 메소드가 리턴 될 때까지 다음 활동이 재개되지 않기 때문에 매우 빠릅니다. 활동이 맨 앞으로 돌아 오면 onResume () 또는 사용자에게 보이지 않으면 onStop ()이 뒤 따릅니다.
onStop () :
다른 활동이 재개되어이 활동을 다루고 있기 때문에 활동이 더 이상 사용자에게 보이지 않을 때 호출됩니다. 이것은 새로운 활동이 시작되고 있거나 기존 활동이이 활동의 앞에 가져 오거나이 활동이 파괴 되었기 때문에 발생할 수 있습니다. 이 활동이 다시 사용자와 상호 작용하기 위해 온 경우 onRestart () 또는이 활동이 사라지면 onDestroy ()가 뒤 따릅니다.
이제 세 가지 활동이 있고 A에서 B로 이동하면 A의 onPause가 B에서 C로 호출되고 B의 onPause 및 A의 onStop이 호출됩니다.
일시 정지 된 활동이 재개되고 중지됨이 다시 시작됩니다.
를 호출 this.finish()
하면 onPause-onStop-onDestroy가 호출됩니다. 기억해야 할 가장 중요한 것은 : paused Activities는 중지되고 Android는 다른 작업을 위해 메모리가 필요할 때마다 중지 된 활동은 삭제됩니다.
충분히 명확하길 바랍니다.
높은 등급의 답변 위에 더 많은 정보 추가 (KILLABLE의 추가 섹션과 수명주기에서 호출 될 다음 메소드 세트 추가) :
위의 표에서 " Killable "열에 유의하십시오. killable 로 표시된 메소드의 경우 해당 메소드가 프로세스를 호스트 한 프로세스를 리턴 한 후 다른 코드 행을 실행하지 않고도 언제든지 시스템이 활동을 종료 할 수 있습니다.
이 때문에이 onPause()
방법을 사용하여 영구 데이터 (예 : 사용자 편집)를 스토리지에 씁니다. 또한 onSaveInstanceState(Bundle)
활동을 이러한 배경 상태로두기 전에 메소드 가 호출되어 활동의 동적 인스턴스 상태를 지정된 Bundle
에 저장하여 나중에 onCreate(Bundle)
활동을 다시 작성해야하는 경우에 수신 할 수 있습니다.
이 글은 영구 데이터를 저장하는 것이 중요합니다 onPause()
대신 onSaveInstanceState(Bundle)
그 문서에 설명 된대로 그렇게 모든 상황에서 호출되지 않습니다 후자의 라이프 사이클 콜백의 일부가 아니므로.
몇 가지 방법을 더 추가하고 싶습니다. 이들은 수명주기 방법으로 표시되지 않지만 일부 조건에 따라 수명주기 동안 호출됩니다. 요구 사항에 따라 적절한 상태 처리를 위해 응용 프로그램에서 이러한 방법을 구현해야 할 수도 있습니다.
onPostCreate(Bundle savedInstanceState)
활동 시작이 완료된 후 (이후
onStart()
및 호출 된 경우) 호출됩니다onRestoreInstanceState(Bundle)
.
onPostResume()
활동 재개가 완료되면 (
onResume()
호출 된 후 ) 호출됩니다.
onSaveInstanceState(Bundle outState)
상태가
onCreate(Bundle)
또는 에서 복원 될 수 있도록 종료되기 전에 활동에서 인스턴스 별 상태를 검색하기 위해 호출됩니다onRestoreInstanceState(Bundle)
(이 메소드로 채워진 번들은 둘 다에 전달됨).
onRestoreInstanceState(Bundle savedInstanceState)
이 메소드는
onStart()
여기에 주어진 이전에 저장된 상태에서 활동이 다시 초기화 될 때 호출 됩니다savedInstanceState
.
이 모든 방법을 사용하는 응용 프로그램 코드 :
public class MainActivity extends AppCompatActivity implements View.OnClickListener{
private EditText txtUserName;
private EditText txtPassword;
Button loginButton;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
Log.d("Ravi","Main OnCreate");
txtUserName=(EditText) findViewById(R.id.username);
txtPassword=(EditText) findViewById(R.id.password);
loginButton = (Button) findViewById(R.id.login);
loginButton.setOnClickListener(this);
}
@Override
public void onClick(View view) {
Log.d("Ravi", "Login processing initiated");
Intent intent = new Intent(this,LoginActivity.class);
Bundle bundle = new Bundle();
bundle.putString("userName",txtUserName.getText().toString());
bundle.putString("password",txtPassword.getText().toString());
intent.putExtras(bundle);
startActivityForResult(intent,1);
// IntentFilter
}
public void onActivityResult(int requestCode, int resultCode, Intent resIntent){
Log.d("Ravi back result:", "start");
String result = resIntent.getStringExtra("result");
Log.d("Ravi back result:", result);
TextView txtView = (TextView)findViewById(R.id.txtView);
txtView.setText(result);
Intent sendIntent = new Intent();
//sendIntent.setPackage("com.whatsapp");
sendIntent.setAction(Intent.ACTION_SEND);
sendIntent.putExtra(Intent.EXTRA_TEXT, "Message...");
sendIntent.setType("text/plain");
startActivity(sendIntent);
}
@Override
protected void onStart() {
super.onStart();
Log.d("Ravi","Main Start");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d("Ravi","Main ReStart");
}
@Override
protected void onPause() {
super.onPause();
Log.d("Ravi","Main Pause");
}
@Override
protected void onResume() {
super.onResume();
Log.d("Ravi","Main Resume");
}
@Override
protected void onStop() {
super.onStop();
Log.d("Ravi","Main Stop");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d("Ravi","Main OnDestroy");
}
@Override
public void onPostCreate(Bundle savedInstanceState, PersistableBundle persistentState) {
super.onPostCreate(savedInstanceState, persistentState);
Log.d("Ravi","Main onPostCreate");
}
@Override
protected void onPostResume() {
super.onPostResume();
Log.d("Ravi","Main PostResume");
}
@Override
public void onSaveInstanceState(Bundle outState, PersistableBundle outPersistentState) {
super.onSaveInstanceState(outState, outPersistentState);
}
@Override
protected void onRestoreInstanceState(Bundle savedInstanceState) {
super.onRestoreInstanceState(savedInstanceState);
}
}
로그인 활동 :
public class LoginActivity extends AppCompatActivity {
private TextView txtView;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_login);
txtView = (TextView) findViewById(R.id.Result);
Log.d("Ravi","Login OnCreate");
Bundle bundle = getIntent().getExtras();
txtView.setText(bundle.getString("userName")+":"+bundle.getString("password"));
//Intent intent = new Intent(this,MainActivity.class);
Intent intent = new Intent();
intent.putExtra("result","Success");
setResult(1,intent);
// finish();
}
}
출력 : (일시 정지 전)
D/Ravi: Main OnCreate
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
출력 : (일시 정지 후 재개)
D/Ravi: Main ReStart
D/Ravi: Main Start
D/Ravi: Main Resume
D/Ravi: Main PostResume
참고 onPostResume()
가 수명주기 방법으로 인용하지 비록 호출됩니다.
위의 답변에 따라 일부 로그를 실행하고 출력은 다음과 같습니다.
활동 시작
On Activity Load (First Time)
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
Reload After BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onCreate:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
OnMaximize(Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onRestart:
D/IndividualChatActivity: onStart:
D/IndividualChatActivity: onResume:
D/IndividualChatActivity: onPostResume:
활동 중지
On BackPressed
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
D/IndividualChatActivity: onDestroy:
OnMinimize (Circle Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
OnMinimize (Square Button)
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Going To Another Activity
————————————————————————————————————————————————
D/IndividualChatActivity: onPause:
D/IndividualChatActivity: onStop:
Close The App
————————————————————————————————————————————————
D/IndividualChatActivity: onDestroy:
내 개인적인 견해로는 두 가지만 시작과 시작에 필요합니다.
onResume은 돌아 오는 모든 인스턴스에 있고, 떠나는 모든 인스턴스에 onPause가있는 것 같습니다 (앱 종료 제외).