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.运行程序
Android App ActivityLifeCycle(安卓活动生命周期)
启动了主活动,查看logd日志
Android App ActivityLifeCycle(安卓活动生命周期)
2.点击按钮1【Start NormalActivity】
Android App ActivityLifeCycle(安卓活动生命周期)
查看logd日志
Android App ActivityLifeCycle(安卓活动生命周期)
主活动先onPause,随后NormalActivity执行三步骤(create-start-resume),此时主活动不可见则执行onStop
3.返回主活动
Android App ActivityLifeCycle(安卓活动生命周期)
返回时,NormalActivity先onPause,随后主活动onRestart并执行2步骤(start-resume),此时NormalActivity不可见,执行onStop,并由于返回时执行过finish(),该活动被销毁前执行onDestory
4.点击按钮2 【Start DialogActivity】
Android App ActivityLifeCycle(安卓活动生命周期)
查看日志
Android App ActivityLifeCycle(安卓活动生命周期)
主活动先onPause,随后DialogActivity执行三步骤
5.返回主活动
Android App ActivityLifeCycle(安卓活动生命周期)
DialogActivity先onPause,随后主活动由于之前仍可见,因此没有onStop,只需再执行onResume即可,而Dialog由于不可见且销毁,执行onStop以及onDestory
6.退出到桌面
Android App ActivityLifeCycle(安卓活动生命周期)
退出时,主活动执行onPause、onStop、onDestory三步骤。

**FINAL **
原书只分析了MainActivity的生命周期、我个人新增了另外两个Activity的生命周期的日志打印。我觉得在分析过了MainActivity的生命周期之后可以再综合分析一下其他两个Activity的生命周期,这样才能更好的理解Android的生命周期的知识。这些的前提都是你对返回栈、活动状态、回调方法等先有足够的熟悉才能进行实践分析。实践出真知,实践才能将所学理论了解深入。