作为Android的四大组件之一的Activity的生命周期是每个Android 程序员必须掌握的知识!
本Demo下共分为三个Activity,分别为MainActivity,NormalActivity,DialogActivity以及它们分别对应的xml布局文件为activity_main.xml,normal_layout.xml,dialog_layout.xml!
Activity代码:
MainActivity.java
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "MainActivity onCreate() ");
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
Button startNormalActivity = (Button)findViewById(R.id.start_normal_activity);
Button startDialogActivity = (Button)findViewById(R.id.start_dialog_activity);
startNormalActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this,NormalActity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, DialogActivity.class);
startActivity(intent);
}
});
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "MainActivity onStart() ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"MainActivity onResume() ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "MainActivity onPause() ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "MainActivity onStop() ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "MainActivity onDestroy() ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "MainActivity onRestart() ");
}
}
@Override
protected void onSaveInstanceState(Bundle outState) {
super.onSaveInstanceState(outState);
Log.d(TAG, "MainActivity onSaveInstanceState() ");
}
在MainActivity中分别重写了父类的onCreate() onStart() onResume() onPause() onStop() onDestory() onRestart()七个生命周期方法以及onSaveInstanceState()方法并在相应的方法中打印log日志。
NormalActivity.java&DialogActivity.java中同样的覆盖以上七个方法并打印Log日子 代码如下
NormalActivity.java
public class NormalActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.normal_layout);
Log.d(TAG, "NormalActivity onCreate() ");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "NormalActivity onStart() ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"NormalActivity onResume() ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "NormalActivity onPause() ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "NormalActivity onStop() ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "NormalActivity onDestroy() ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "NormalActivity onRestart() ");
}
}
DialogActivity.java
public class DialogActivity extends Activity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.dialog_layout);
Log.d(TAG, "DialogActivity onCreate() ");
}
@Override
protected void onStart() {
super.onStart();
Log.d(TAG, "DialogActivity onStart() ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG,"DialogActivity onResume() ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "DialogActivity onPause() ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "DialogActivity onStop() ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "DialogActivity onDestroy() ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "DialogActivity onRestart() ");
}
}
以下是XML布局文件关键代码:
activity_main.xml
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/start_normal_activity"
android:text="Start NormalActivity" />
<Button
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:id="@+id/start_dialog_activity"
android:text="Start DialogActivity" />
normal.xml
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a normal activity!"/>
dialog_layout.xml
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a dialog Activity!"/>
接下来就是在AndroidManifest.xml文件中对三个Activity进行相应的注册
关键代码如下:注意其中指定DialogActivity的Theme为Theme.Dialog
这样是让DialogActivity使用一个对话框方式的主题
<activity
android:name=".MainActivity"
android:label="@string/app_name"
android:theme="@style/AppTheme.NoActionBar">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NormalActivity" />
<activity
android:name=".DialogActivity"
android:theme="@android:style/Theme.Dialog">
</activity>
接下来运行程序 可以看到此时Log日子信息如下:
在activity开始创建时会顺序的调用onCreate(),onStart(),onResume()三个方法
此时activity进入运行状态
04-11 16:31:23.840 11678-11678/? D/MainActivity: MainActivity onCreate()
04-11 16:31:23.880 11678-11678/? D/MainActivity: MainActivity onStart()
04-11 16:31:23.880 11678-11678/? D/MainActivity: MainActivity onResume()
点击start NormalActivity按钮启动NormalActivity 此时在观察日志信息发现多出如下日子:
系统会首先调用MainActivity的onOnpause方法 然后在调用跳转acctivity创建时的三个方法,
最后再调用MainActivity的onSaveInstanceState以及onStop,此时MainActivity进入停止状态,
NormalActivity进入运行状态。
04-11 16:41:07.660 11678-11678/? D/MainActivity: MainActivity onPause()
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onCreate()
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onStart()
04-11 16:41:07.850 11678-11678/? D/MainActivity: NormalActivity onResume()
04-11 16:41:08.210 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState()
04-11 16:41:08.210 11678-11678/? D/MainActivity: MainActivity onStop()
然后再点击back按键返回MainActivity发现多出如下日志信息:
首先调用Mainactivity的onPause,onRestart,onStart,onResume进入运行状态。
然后调用NormalActivity的onStop记忆onDestory方法。
04-11 16:44:17.290 11678-11678/? D/MainActivity: NormalActivity onPause()
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onRestart()
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onStart()
04-11 16:44:17.300 11678-11678/? D/MainActivity: MainActivity onResume()
04-11 16:44:17.680 11678-11678/? D/MainActivity: NormalActivity onStop()
04-11 16:44:17.680 11678-11678/? D/MainActivity: NormalActivity onDestroy()
然后点击start dialogActivity按钮发现多出如下日志信息:
与启动NormalActivity唯一不同的时没有调用MainActivity onStop(),这是因为此时MainActivity还没有完全不可见。
04-11 16:47:35.620 11678-11678/? D/MainActivity: MainActivity onPause()
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onCreate()
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onStart()
04-11 16:47:35.720 11678-11678/? D/MainActivity: DialogActivity onResume()
04-11 16:47:36.030 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState()
点击back返回按键返回MainActivity发现多出如下日志信息:
04-11 16:49:06.990 11678-11678/? D/MainActivity: DialogActivity onPause()
04-11 16:49:07.010 11678-11678/? D/MainActivity: MainActivity onResume()
04-11 16:49:07.150 11678-11678/? D/MainActivity: DialogActivity onStop()
04-11 16:49:07.150 11678-11678/? D/MainActivity: DialogActivity onDestroy()
再点击返回键,推出程序 日志如下:
04-11 16:50:24.420 11678-11678/? D/MainActivity: MainActivity onPause()
04-11 16:50:25.140 11678-11678/? D/MainActivity: MainActivity onSaveInstanceState()
04-11 16:50:25.140 11678-11678/? D/MainActivity: MainActivity onStop()
这就是整个的生命周期
关于生命周期你应该知道的:
这整个的生命周期中总计三个循环,四种状态,七个方法!
三个循环:
1.整个的生命周期 onCreate到onDestory
2.可见生命周期onStart到onStop
3.前台生命周期onResume到onPause 此时activity位于最前端与用户进行交互。
四种状态:
1.在屏幕前台 运行状态(running)
2.暂停状态(Paused),比如demo中的dialogActivity获得用户焦点,但是此时MainActivity还是依然可见的,此时的MainActivity的状态就叫暂停状态。
3.停止状态(Stopped) 如demo中的从MainActivity条状到NormalActivity之后Mainactivity完全被覆盖掉,此时的MainActivity就进入停止状态
4.死亡状态 ,如果一个Activity是Paused或者Stopped状态,系统可以将该Activity从内存中删除,当该Activity再次显示给用户时,它就又开始了新一轮的生命周期。系统从内存删除activity时会调用该activity的onDestory方法
图片来自于网络。