이 기사에서는 Activity의 수명 주기를 소개합니다. iOS를 공부했다면 Activity의 수명 주기는 iOS의 ViewController의 수명 주기와 매우 유사합니다. 생애주기는 이해하기 어렵지 않습니다. 사람의 일생은 태어나고 늙고 병들고 죽는 과정으로 이루어지며, 꽃의 일생은 꽃이 피고 지는 과정입니다. Android에서 Activity의 수명주기는 Activity 생성부터 종료까지의 과정에 지나지 않습니다. 이 블로그에서는 액티비티 수명 주기의 다양한 단계를 소개하고 예제를 통해 액티비티 수명 주기를 살펴보겠습니다. 각 라이프사이클의 각 단계를 이해해야만 다양한 단계에서 다양한 작업을 수행할 수 있으므로 Activity의 라이프사이클을 이해하는 것이 중요합니다.
다음으로 예제를 통해 Activity의 라이프사이클을 소개하겠습니다. 이 데모에서는 MainActivity가 앱이 시작된 후 표시되는 첫 번째 Activity입니다. MainActivity에 버튼이 있습니다. 이 버튼을 클릭하면 SecondActivity로 이동합니다. Return 키를 클릭하면 SecondActivity에서 앱이 종료됩니다. 이러한 일련의 Activity 전환을 통해 Log를 출력하여 Activity Life Cycle을 관찰해 보겠습니다.
1. 코드 작성
사실 이 블로그의 코드는 Activity 라이프사이클의 여러 단계에서 메소드를 다시 작성한 다음 메소드에 Log를 인쇄하는 것입니다. 이 수명주기의 단계를 표시합니다. 데모의 UI도 매우 간단하므로 액티비티의 레이아웃 파일에 대해 너무 자세히 설명하지 않겠습니다. 다음으로 두 활동의 키 코드를 살펴보세요.
1. 아래 코드는 MainActivity의 핵심 코드입니다. Activity 수명 주기의 여러 단계를 다시 작성한 다음 어떤 메서드에 Activity가 있는지 표시하는 로그를 인쇄합니다. onCreate() 메서드에서 ID로 Button을 가져온 다음 클릭 이벤트를 버튼에 바인딩하고 버튼을 클릭하면 SecondActivity로 이동합니다. 구체적인 코드는 다음과 같습니다.
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); Log.d("lifeCycle", "MainActivity: 我是onCreate方法,我会在Activity第一次被创建是调用"); Button jumpButton = (Button) findViewById(R.id.jump_second_button); jumpButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { //跳转到SecondActivity Intent intent = new Intent(MainActivity.this, SecondActivity.class); startActivity(intent); } }); } //Ctrl + O 选择父类中的方法进行重写 @Override protected void onStart() { super.onStart(); Log.d("lifeCycle", "MainActivity: 我是onStart方法,我会在Activity由不可见变为可见时调用"); } @Override protected void onResume() { super.onResume(); Log.d("lifeCycle", "MainActivity: 我是onResume方法,我在Activity处于运行状态时调用"); } @Override protected void onPause() { super.onPause(); Log.d("lifeCycle", "MainActivity: 我是onPause方法,我会在Activity暂停时调用"); } @Override protected void onStop() { super.onStop(); Log.d("lifeCycle", "MainActivity: 我是onStop方法,我会在Activity停止时调用"); } @Override protected void onRestart() { super.onRestart(); Log.d("lifeCycle", "MainActivity: 我是onRestart方法,我会在Activty从停止状态变为运行状态时调用"); } @Override protected void onDestroy() { super.onDestroy(); Log.d("lifeCycle", "MainActivity: 我是onDestroy方法,我会在Activty销毁之前调用"); }
2. 위 메서드도 SecondActivity에서 다시 작성되었습니다. 유일한 차이점은 위 로그의 MainActivity를 SecondActivity로 변경하는 것입니다. 코드는 위에 붙여넣지 않습니다.
2. 인쇄된 로그를 실행하고 관찰합니다.
앱을 실행한 후 인쇄된 로그를 관찰하고, 예제를 통해 Activity 수명 주기를 분석합니다. 구체적인 단계는 다음과 같습니다.
1. Activity 생성 및 활성화
앱을 처음 열 때 출력되는 로그는 다음과 같습니다. MainActivity는 앱을 열었을 때 가장 먼저 보이는 것입니다. MainActivity가 처음 나타날 때 다음 세 가지 메소드를 호출해야 한다는 것을 쉽게 알 수 있습니다. 아래 세 가지 메소드가 생성된 후 표시됩니다. , 마침내 실행 상태가 됩니다.
(1).onCreate() 메서드: 이 메서드는 활동이 처음 생성될 때 호출됩니다. 이전 데모에서는 활동 및 관련 이벤트의 레이아웃 및/또는 컨트롤을 로드했습니다. 방법.
(2).onStar()t 메소드: 그러면 onStart() 메소드가 실행됩니다. 활동이 표시되지 않음에서 표시로 변경될 때 이 메소드가 호출됩니다.
(3).onResume 메서드: Activity가 표시되면 onResume 메서드를 호출하여 이를 실행 상태로 변경해야 합니다.
2. Activity 간 전환
더 명확하게 하기 위해 SecondActivity로 이동하는 버튼을 클릭하기 전에 로그를 지울 수 있습니다. 왼쪽 아래 버킷 마크는 이전에 인쇄된 로그를 삭제하는 데 사용됩니다. 아래에 출력되는 로그는 점프 버튼을 클릭했을 때 출력되는 로그입니다. 이 전환 과정에서 MianActivty는 실행을 멈추고 보이지 않게 되며, SecondActivy가 생성되어 실행 중인 상태가 됩니다. 구체적인 단계는 다음과 같습니다.
(1).onPause() 메서드: 점프 버튼을 클릭하면 실행 중인 MainActivity가 onPause()를 호출하여 중지되지만 여전히 표시됩니다.
(2) 그런 다음 SecondActivity는 onCreate() 메서드를 호출하여 생성하고, onStart() 메서드를 표시하고, onResume() 메서드를 호출합니다.
(3).onStop() 메서드: SecondActivity가 실행 중일 때는 MainActivity가 완전히 보이지 않으므로 onStop() 메서드가 호출되어 완전히 보이지 않는 중지 상태로 들어갑니다.
3. 다른 액티비티에서 복귀
SecondActivity에서 MainActivity로 돌아가려면 SecondActivity에서 복귀 키를 클릭하세요. 아래 Log는 복귀 버튼을 클릭했을 때 출력되는 Log입니다.
(1) onPause() 메소드: Return 버튼을 클릭한 후 SecondActivity는 onPause() 메소드를 호출하여 일시 정지된 실행 상태로 들어갑니다.
(2)onRestart() 메서드: 그러면 MainActivity는 onRestart() 메서드를 호출하여 중지된 상태에서 실행 중인 상태로 변경됩니다. 그런 다음 MainActivity는 보이지 않는 상태에서 보이는 상태로 onStart 메서드를 호출한 다음 onResume() 메서드를 호출하여 최종적으로 실행 상태로 들어갑니다.
(3)当返回到MainActivity中并且MainActivity处于运行状态后,SecondActivity会调用onStop方法,停止运行并不可见。因为SecondActivty做的事出栈操作,停止运行后,就会调用onDestory方法进行销毁。下此在进入SecondActivity中时,还是从onCreate方法进行执行。
4.Activity退出并销毁
接着在MainActivity中点击返回按钮就会退出App了,下方是退出App时打印的Log信息。MainActivty先调用onPause()方法变为暂停运行状态,然后再调用onStop()方法停止运行,最后调用onDestroy()方法进行销毁。
三.生命周期流程图
1.上面是用语言通过实例打印出的Log来描述两个Activity切换的生命周期,接下来将用一个流程图来描述这一过程,具体流程图如下。
2.通过上面的实例不难分析出一个Activity的生命周期分为哪些阶段,并且很容易的看出哪些阶段在什么时候执行,所以我们很容易的画出一个Activity的生命周期,下方的流程图是一个Activity的生命周期。
四.Activity的加载模式
Activity的启用模式也较为简单,它会在活动切换时用到。Activity的启动模式分为四种,standard、singleTop、singleTask、singleInstance模式。接下来将为大家详细的介绍一下这几种加载模式。
Activity的加载模式可以在配置文件AndroidManifest.xml中进行配置,配置项为android:launchMode具体如下图所示:
1.standard模式
在Activity的栈中无论该活动有没有加入栈,活动就会被创建。测试方式是把MainActivity的launchMode设置成standard, 在MainActivity中添加一个按钮,点击按钮使用Intent跳转到当前Activity,看onCreate方法中打印的Log。点击按钮的方法如下:
Button launchModelButton = (Button) findViewById(R.id.launch_model_button); launchModelButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent = new Intent(MainActivity.this, MainActivity.class); startActivity(intent); } });
standard加载模式的栈如下所示,无论栈中有没有该对象的实例,都会被创建。
2.singleTop模式
只要被创建的活动不位于栈的顶部,该活动就会被创建入栈。如果将要被创建的活动位于栈的顶部,该活动的实例就不会被创建。测试方法,把上面的模式直接改成singleTop模式,MainActivty往自己身上跳转就不会从新创建一个新的实例,会重用之前在栈顶中的实例。如果是MainActivty跳转到SecondActivty, 然后SecondActivity再次跳转到MainActivty, 那么此时的MainActivity将会被创建,因为栈顶是SecondActivity。如下所示:
3.singleTask模式
单任务模式,这个也不难理解,如果从MainActivty跳转到SecondActivity, 如果再从SecondActivty跳转到MainActivity, 在单任务模式下MainActivity已经在栈中,就会把它之前的Activity出栈,使其处于在栈顶活跃的位置。原理如下图所示:
4.singleInstance
可以看成单例模式,这个比较特殊,被设置成singleInstance的Activity将会放入另一个栈中,因为这样为了便于共用。上面3中模式位于同一个栈中。下方ThirdActivity跳转到一个加载模式为singleInstance的Activity中。
오늘의 Activity Life Cycle은 여기까지입니다. 관련 내용은 다음 블로그에 업데이트하겠습니다.
Android 개발에서 Activity의 라이프사이클과 로딩 모드에 대한 자세한 설명은 PHP 중국어 웹사이트를 참고하세요!