이 기사에서는 예제를 통해 Android 프로그래밍 활동의 전체 수명 주기를 분석합니다. 참고할 수 있도록 모든 사람과 공유하세요. 자세한 내용은 다음과 같습니다.
Android의 활동에는 고유한 수명 주기가 있습니다. 이 지식을 배우면 나중에 프로그램을 작성할 때 발생하는 일부 오류를 더 잘 이해하는 데 도움이 될 수 있습니다. . 글이 너무 길어서 모두의 시간을 차지하지 않았으면 좋겠습니다~
오늘은 액티비티 스택에 대해 너무 많이 다루지 않고 주로 액티비티 자체의 라이프사이클에 대해 다루겠습니다
여러 가지 개념 구별
1 액티비티 공식적인 설명은 “액티비티는 사용자가 전화 걸기, 사진 찍기, 전송하기 등의 작업을 수행하기 위해 상호 작용할 수 있는 화면을 제공하는 애플리케이션 구성 요소입니다. 이메일을 보내거나 지도를 봅니다. 각 활동에는 사용자 인터페이스를 그리는 창이 제공됩니다. 즉, 사용자가 상호 작용하는 데 사용하는 모든 창은 사용자가 현재 수행 중인 작업입니다.
2 백 스택 사용자는 프로그램을 터치하여 애플리케이션 런처를 통해 활동 A를 시작합니다. 현재 활동 A가 새 활동 B를 시작하면 시작된 활동 A가 스택의 맨 위로 푸시됩니다. A가 onStop 함수를 호출하면 시스템은 이 활동 정보를 유지합니다. 사용자가 뒤로 키를 누르면 백 스택은 팝 작업을 수행하고 스택 팝 및 팝에 대한 구체적인 세부 정보를 호출합니다. 나중에 자세히 소개하겠습니다.
3가지 작업 사용자가 액티비티에 있을 때: 액티비티 A의 이름이 "TaskOne 애플리케이션"이고 HOME 키를 누르면 사용자가 런처로 돌아갑니다. 이때 사용자가 새 애플리케이션을 다시 터치하면 새로운 애플리케이션이 생성됩니다. 태스크와 백 스택은 태스크를 나타냅니다. 서로 다른 프로그램의 활동이 동일한 스택에 푸시될 수 있습니다. 이는 예를 들어 프로그램이 함께 제공되는 문자 메시지 활동을 시작할 수 있음을 의미합니다. 사용자에게 문자 메시지를 보내는 것이 프로그램의 기능인 것처럼 느껴집니다.
참고: 위 동작은 시스템의 기본 설정입니다. 활동 동작을 변경하는 방법에는 두 가지가 있습니다. 하나는 B를 시작하기 위해 A를 추가하는 것입니다. B의 매니페스트 설정에서 동작을 변경하는 것입니다. 다른 하나는 활동에 의해 시작된 인텐트에서 시작될 활동 설정을 지정하는 것입니다. 인텐트의 우선순위는 Manifest.xml 파일보다 높습니다. , 일부 모드는 동시에 존재하지 않습니다.
Android의 수명 주기에는 onCreate onStart onRestart onPause onStop onDestroy가 포함되어 있습니다. 각 메소드의 호출 시간은 아래에 설명되어 있습니다.
onCreate() 이 상태에서는 액티비티를 종료할 수 없습니다.
액티비티가 처음 생성될 때 호출되는 곳입니다. 일반적인 정적 설정: 뷰 생성, 데이터를 목록에 바인딩 등. 이 메소드는 활동의 이전 고정 상태가 포함된 번들(있는 경우)도 제공합니다.
항상 onStart()가 뒤따릅니다.
//활동이 처음 생성될 때 호출해야 합니다. 이 메소드에서 모든 정적 생성, 뷰 생성, 데이터를 목록에 바인딩(setContnetView 메소드를 통해) 등을 수행해야 합니다. 이 메소드는 또한 다음을 포함하는 번들을 제공합니다. onStart 메소드에서 액티비티의 가장 최근 상태입니다.
//액티비티가 중지되면 호출되고 다시 시작되기 전에 호출됩니다.
onResume() 시간은 활동을 종료할 수 없습니다.
활동이 사용자와 상호작용을 시작할 때 호출됩니다. 이 시점에서 활동은 사용자 입력과 함께 활동 스택의 맨 위에 있습니다.
//사용자와 상호작용하기 위해 활동이 시작될 때 호출됩니다. 현재 귀하의 활동은 활동 스택의 최상위에 있으며 사용자 입력에 사용됩니다.
onPause() 활동은 다음을 제외하고 여러 상태에서 종료될 수 없습니다. android HoneyComb 시스템
시스템이 이전 활동을 재개하려고 할 때 호출됩니다. 이는 일반적으로 저장되지 않은 변경 사항을 영구 데이터에 적용하고, 애니메이션을 중지하고, CPU를 소모할 수 있는 작업 등을 수행하는 데 사용됩니다. 이 메소드가 반환될 때까지 다음 액티비티가 재개되지 않으므로 매우 빠릅니다.
//시스템이 다시 시작되려고 할 때 이전 활동이 호출될 때 호출됩니다(이해가 안 되지만, 내 이해는: 현재 활동이 새 활동을 시작하려고 할 때 호출됨). 일반적인 애플리케이션은 다음과 같이 사용됩니다. 저장되지 않은 데이터를 현재 데이터에 제출합니다(데이터 업데이트만 저장함을 의미). CPU를 소비할 수 있는 애니메이션 및 기타 작업을 중지합니다. 이 메서드가 반환될 때까지 다음 활동이 다시 시작되지 않으므로 이 메서드의 구현은 빨라야 합니다.
액티비티가 보이지 않게 되면 onPause 이후에 onStop 메서드가 호출됩니다.
onStop() 액티비티는 여러 상태에서 종료될 수 있습니다.
액티비티가 더 이상 사용자에게 표시되지 않을 때 호출됩니다. 다른 활동이 재개되어 이 활동을 다루고 있습니다. 이는 새 활동이 시작되거나, 기존 활동이 이 활동 앞으로 가져오거나, 이 활동이 소멸되기 때문에 발생할 수 있습니다.
다음에 onRestart( ) 이 액티비티가 사용자와 상호작용하기 위해 다시 돌아오는 경우, 또는 이 액티비티가 사라지는 경우 onDestroy().
//다른 액티비티에 다시 시작 및 덮어쓰기가 있어서 해당 액티비티가 더 이상 사용자에게 표시되지 않을 때 호출됩니다. 현재 활동(스택에 있음). 새 활동이 시작되거나 기존 활동이 포그라운드로 돌아가거나 현재 활동이 삭제되는 경우. 액티비티가 전경으로 돌아가서 사용자와 상호작용하려는 경우 이 메서드 다음에 onReatart 메서드가 호출됩니다. 현재 액티비티가 종료되면 onDestroy 메서드가 이 메서드
다음에 호출됩니다. () 회. 이 상태에서 활동이 종료될 수 있습니다.
활동이 종료되기 전에 수신한 마지막 호출(누군가가 종료()를 호출했거나 시스템이 종료되었기 때문에)이 발생할 수 있습니다. 공간을 절약하기 위해 활동의 인스턴스를 일시적으로 삭제합니다. isFinishing() 메서드를 사용하면 이 두 가지 시나리오를 구분할 수 있습니다. 대신 시스템은 공간을 확보하기 위해 활동 인스턴스를 삭제합니다. onPause 메서드를 사용하여 활동이 일시 중지되거나 종료되는지 확인합니다.
아래 그림은 공식 웹사이트의 수명 주기 데모입니다
자, 제가 작성한 데모 예제를 살펴보겠습니다.
MainFest.xml레이아웃 파일 main.xml
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="uni.activity" android:versionCode="1" android:versionName="1.0"> <uses-sdk android:minSdkVersion="7" /> <application android:icon="@drawable/icon" android:label="@string/app_name"> <activity android:name=".ActivityDemoActivity" android:label="@string/app_name"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <activity android:name=".Activity01" android:label="@string/app_name"> </activity> </application> </manifest>
activity01 .xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/Button_A" android:text="GO to activity 2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
String.xml
<?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:orientation="vertical" android:layout_width="fill_parent" android:layout_height="fill_parent" > <TextView android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="@string/hello" /> <Button android:id="@+id/Button_A" android:text="GO to activity 2" android:layout_width="fill_parent" android:layout_height="wrap_content" /> </LinearLayout>
ActivityDemoActivity.java
<?xml version="1.0" encoding="utf-8"?> <resources> <string name="hello">Hello World, ActivityDemoActivity!</string> <string name="app_name">ActivityDemo</string> <string name="activity01">this is activity 01</string> </resources>
Activity01.java
/* * @author octobershiner * 2011 07 29 * SE.HIT * 演示完整的activity的声明周期,以及isFinish方法的调用 * 此activity为程序入口activity * */ package uni.activity; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.view.View.OnClickListener; import android.widget.Button; public class ActivityDemoActivity extends Activity { /** Called when the activity is first created. */ private static final String TAG = "demo"; private Button button_A; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); button_A = (Button)this.findViewById(R.id.Button_A); button_A.setOnClickListener(new myButtonListener()); } private class myButtonListener implements OnClickListener{ @Override public void onClick(View v) { // TODO Auto-generated method stub Intent intent = new Intent(); intent.setClass(ActivityDemoActivity.this, Activity01.class); ActivityDemoActivity.this.startActivity(intent); //感兴趣的朋友可以取消下面的代码注释,来测试finish方法的使用,会发现第一个activity会被强制终止 //ActivityDemoActivity.this.finish(); } }; protected void onStart(){ super.onStart(); Log.i(TAG, "The activityDemo state---->onStart"); } protected void onRestart(){ super.onRestart(); Log.i(TAG, "The activityDemo state---->onReatart"); } protected void onResume(){ super.onResume(); Log.i(TAG, "The activityDemo state---->onResume"); } protected void onPause(){ super.onPause(); //调用isFinishing方法,判断activity是否要销毁 Log.i(TAG, "The activityDemo state---->onPause"); if(isFinishing()){ Log.w(TAG, "The activityDemo will be destroyed!"); }else{ Log.w(TAG, "The activityDemo is just pausing!"); } } protected void onStop(){ super.onStop(); Log.i(TAG, "The activityDemo state---->onStop"); } protected void onDestroy(){ super.onDestroy(); Log.i(TAG, "The activityDemo state---->onDestroy"); } }
다음은 시연 결과
/* * @author octobershiner * 2011 07 29 * SE.HIT * 演示完整的activity的声明周期,以及isFinish方法的调用 * 此activity可由ActivityDemoActivity启动 * */ package uni.activity; import android.app.Activity; import android.os.Bundle; import android.util.Log; public class Activity01 extends Activity{ private static final String TAG = "demo"; @Override protected void onCreate(Bundle savedInstanceState) { // TODO Auto-generated method stub super.onCreate(savedInstanceState); setContentView(R.layout.activity01); Log.d(TAG, "The activity01 state---->onStart"); } protected void onStart(){ super.onStart(); Log.d(TAG, "The activity01 state---->onStart"); } protected void onRestart(){ super.onRestart(); Log.d(TAG, "The activity01 state---->onReatart"); } protected void onResume(){ super.onResume(); Log.d(TAG, "The activity01 state---->onResume"); } protected void onPause(){ super.onPause(); Log.d(TAG, "The activity01 state---->onPause"); //调用isFinishing方法,判断activity是否要销毁 if(isFinishing()){ Log.w(TAG, "The activity01 will be destroyed!"); }else{ Log.w(TAG, "The activity01 is just pausing!"); } } protected void onStop(){ super.onStop(); Log.d(TAG, "The activity01 state---->onStop"); } protected void onDestroy(){ super.onDestroy(); Log.d(TAG, "The activity01 state---->onDestroy"); } }작업 과정은 다음과 같습니다. Start ActivityDemoActivity
그런 다음 버튼을 클릭하여 Activity01로 들어갑니다
(액티비티가 먼저 일시정지되고 해제되지 않는 것을 볼 수 있습니다. 실제로는 새로운 액티비티 푸시 프로세스이고, 새로운 액티비티가 시작되면 onCreate, 그 다음 onStart가 되어야 한다고 썼습니다. 주의 깊은 친구들은 이전 액티비티가 보이지 않을 때 onStop 메서드가 호출된다는 것을 알았어야 합니다.
그런 다음 Return 키를 눌러 ActivityDemoActivity 로 돌아갑니다. 스택 상단의 Activity01은 스택 팝 작업을 수행하며 디스플레이가 소멸됩니다) 다시 Return 키를 누르면 데스크탑으로 돌아갑니다사실 Dongxie의 글은 조금 길지만 기본적으로 활동의 전체 라이프사이클을 보여줍니다.
이 글이 안드로이드 프로그래밍에 종사하는 모든 분들께 도움이 되기를 바랍니다. Android가 가로 화면과 세로 화면을 전환할 때 Activity 수명 주기와 관련된 더 많은 기사를 보려면 PHP 중국어 웹사이트를 주목하세요!