Android App ActivityLifeCycle(安卓活动生命周期)
Android App ActivityLifeCycle(安卓活动生命周期)
关于
- 返回栈
- 活动的4个运行状态 (运行-暂停-停止-销毁)
- 活动的7个回调方法(onCreate-onStart-onResume-onPause-onStop-onDestory-onRestart)
- 3种生存期(完整生存期-可见生存期-前台生存期)
这些内容都可以在本站中其他博主的博客里找到,本博客不再赘述。
本博客基于郭霖 著《第一行代码 Android》内的2.4.4体验活动的生命周期进行了改进。原本只体验了MainActivity的整个生命周期,本文新增了Normal以及Dialog的生命周期的分析。
1.创建主活动及两个子活动,分别为:MainActivity和NormalActivity以及DialogActivity
分别对应的布局是activity_main和normal_layout以及dialog_layout
activity_main.xml 主活动布局,创建两个按钮(Button)分别对应启动NormalActivity和DialogActivity
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<Button
android:id="@+id/start_normal_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start NormalActivity" />
<Button
android:id="@+id/start_dialog_activity"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="Start DialogActivity" />
</LinearLayout>
normal_layout.xml 普通活动的活动布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a normal activity"
/>
</LinearLayout>
dialog_layout.xml 对话活动的活动布局
<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="wrap_content">
<TextView
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text="This is a dialog activity"
/>
</LinearLayout>
2.到AndroidMainfest.xml中注册活动修改主题样式
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="com.hfut.activitylifecycletest">
<application
android:allowBackup="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:supportsRtl="true"
android:theme="@style/AppTheme">
<activity android:name=".MainActivity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
</activity>
<activity android:name=".NormalActivity" >
</activity>
<activity android:name=".DialogActivity"
android:theme="@style/Theme.AppCompat.Dialog" >
</activity>
</application>
</manifest>
其中主要的是倒数第四行 android:theme="@style/Theme.AppCompat.Dialog
3.MainActivity.java
注册了2个按钮的监听器、以及用logd打印了每个活动的回调方法
package com.hfut.activitylifecycletest;
import android.content.Intent;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
import android.view.View;
import android.widget.Button;
public class MainActivity extends AppCompatActivity {
private static final String TAG = "MainActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
Log.d(TAG, "onCreate: ");
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(){ //按钮1的监听器
@Override
public void onClick(View v) {
Intent intent = new Intent(MainActivity.this, NormalActivity.class);
startActivity(intent);
}
});
startDialogActivity.setOnClickListener(new View.OnClickListener(){ //按钮2的监听器
@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, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
}
4.NormalActivity.java 增加了回调方法的logd打印日志
书中并没有增加,我选择增加了这些打印日志以便更好的查看各个活动的回调方法
package com.hfut.activitylifecycletest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class NormalActivity extends AppCompatActivity {
private static final String TAG = "NormalActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: ");
super.onCreate(savedInstanceState);
setContentView(R.layout.normal_layout);
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
}
5.DialogActivity.java 增加了回调方法的logd打印日志
书中并没有增加,我选择增加了这些打印日志以便更好的查看各个活动的回调方法
package com.hfut.activitylifecycletest;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.util.Log;
public class DialogActivity extends AppCompatActivity {
private static final String TAG = "DialogActivity";
@Override
protected void onCreate(Bundle savedInstanceState) {
Log.d(TAG, "onCreate: ");
super.onCreate(savedInstanceState);
setContentView(R.layout.dialog_layout);
}
@Override
protected void onStart(){
super.onStart();
Log.d(TAG, "onStart: ");
}
@Override
protected void onResume() {
super.onResume();
Log.d(TAG, "onResume: ");
}
@Override
protected void onPause() {
super.onPause();
Log.d(TAG, "onPause: ");
}
@Override
protected void onStop() {
super.onStop();
Log.d(TAG, "onStop: ");
}
@Override
protected void onDestroy() {
super.onDestroy();
Log.d(TAG, "onDestroy: ");
}
@Override
protected void onRestart() {
super.onRestart();
Log.d(TAG, "onRestart: ");
}
}
结果分析:
1.运行程序
启动了主活动,查看logd日志
2.点击按钮1【Start NormalActivity】
查看logd日志
主活动先onPause,随后NormalActivity执行三步骤(create-start-resume),此时主活动不可见则执行onStop
3.返回主活动
返回时,NormalActivity先onPause,随后主活动onRestart并执行2步骤(start-resume),此时NormalActivity不可见,执行onStop,并由于返回时执行过finish(),该活动被销毁前执行onDestory
4.点击按钮2 【Start DialogActivity】
查看日志
主活动先onPause,随后DialogActivity执行三步骤
5.返回主活动
DialogActivity先onPause,随后主活动由于之前仍可见,因此没有onStop,只需再执行onResume即可,而Dialog由于不可见且销毁,执行onStop以及onDestory
6.退出到桌面
退出时,主活动执行onPause、onStop、onDestory三步骤。
**FINAL **
原书只分析了MainActivity的生命周期、我个人新增了另外两个Activity的生命周期的日志打印。我觉得在分析过了MainActivity的生命周期之后可以再综合分析一下其他两个Activity的生命周期,这样才能更好的理解Android的生命周期的知识。这些的前提都是你对返回栈、活动状态、回调方法等先有足够的熟悉才能进行实践分析。实践出真知,实践才能将所学理论了解深入。