当前位置 博文首页 > 小旺的博客:打穿-Activity生命周期

    小旺的博客:打穿-Activity生命周期

    作者:[db:作者] 时间:2021-07-17 09:47

    活动的生存期

    在这里插入图片描述
    Activity类中定义了7个回调方法,覆盖了活动生命周期的每一个环节:

    onCreate()。这个方法你已经看到过很多次了,每个活动中我们都重写了这个方法,它会在活动第一次被创建的时候调用。你应该在这个方法中完成活动的初始化操作,比如说加载布局、绑定事件等。

    onStart()。这个方法在活动由不可见变为可见的时候调用。

    onResume()。这个方法在活动准备好和用户进行交互的时候调用。此时的活动一定位于返回栈的栈顶,并且处于运行状态。

    onPause()。这个方法在系统准备去启动或者恢复另一个活动的时候调用。我们通常会在这个方法中将一些消耗CPU的资源释放掉,以及保存一些关键数据,但这个方法的执行速度一定要快,不然会影响到新的栈顶活动的使用。

    onStop()。这个方法在活动完全不可见的时候调用。它和onPause()方法的主要区别在于,如果启动的新活动是一个对话框式的活动,那么onPause()方法会得到执行,而onStop()方法并不会执行。

    onDestroy()。这个方法在活动被销毁之前调用,之后活动的状态将变为销毁状态。

    onRestart()。这个方法在活动由停止状态变为运行状态之前调用,也就是活动被重新启动了。

    以上7个方法中除了onRestart()方法,其他都是两两相对的

    体验活动的生命周期

    1.新建一个ActivityLifeCycleTest项目
    2.右击com.example.activitylifecycletest包→New→Activity→EmptyActivity,
    新建Normal-Activity,布局起名为normal_layout。
    然后使用同样的方式创建DialogActivity,布局起名为dialog_layout。
    3.编辑normal_layout.xml文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="This is a normal activity"
            />
    
    
    </LinearLayout>
    

    4.编辑dialog_layout.xml文件

    <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:orientation="vertical"
        android:layout_width="match_parent"
        android:layout_height="match_parent">
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="This is a dialog activity"
            />
    
    
    </LinearLayout>
    

    5.修改AndroidManifest.xml的标签的配置

    <?xml version="1.0" encoding="utf-8"?>
    <manifest xmlns:android="http://schemas.android.com/apk/res/android"
        package="com.example.activitylifecycletest">
    
        <application
            android:allowBackup="true"
            android:icon="@mipmap/ic_launcher"
            android:label="@string/app_name"
            android:roundIcon="@mipmap/ic_launcher_round"
            android:supportsRtl="true"
            android:theme="@style/AppTheme">
            <activity android:name=".DialogActivity"
                android:theme="@style/Theme.AppCompat.Dialog"></activity>
            <activity android:name=".Normal_Activity" />
            <activity android:name=".MainActivity">
                <intent-filter>
                    <action android:name="android.intent.action.MAIN" />
    
                    <category android:name="android.intent.category.LAUNCHER" />
                </intent-filter>
            </activity>
        </application>
    
    </manifest>
    

    6.修改activity_main.xml

    <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>
    

    我们在LinearLayout中加入了两个按钮,一个用于启动NormalActivity,一个用于启动DialogActivity。

    7.修改MainActivity中的代码:

    package com.example.activitylifecycletest;
    
    import androidx.annotation.Nullable;
    import androidx.appcompat.app.AppCompatActivity;
    
    import android.content.Intent;
    import android.os.Bundle;
    import android.os.PersistableBundle;
    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() {
                @Override
                public void onClick(View view) {
                    Intent intent=new Intent(MainActivity.this,Normal_Activity.class);
                    startActivity(intent);
                }
            });
            startDialogActivity.setOnClickListener(new View.OnClickListener() {
                @Override
                public void onClick(View view) {
                    Intent intent=new Intent(MainActivity.this,DialogActivity.class);
                    startActivity(intent);
                }
            });
        }
    
        @Override
        protected void onStart() {
            super.onStart();
            Log.d(TAG,"onStart");
        }
    
        @Override
        protected void onStop() {
            super.onStop();
            Log.d(TAG,"onStop");
        }
    
        @Override
        public void onCreate(@Nullable Bundle savedInstanceState, @Nullable PersistableBundle persistentState) {
            super.onCreate(savedInstanceState, persistentState);
            Log.d(TAG,"onCreate");
        }
    
        @Override
        protected void onRestart() {
            super.onRestart();
            Log.d(TAG,"onRestart");
        }
    
        @Override
        protected void onDestroy() {
            super.onDestroy();
            Log.d(TAG,"onDestroy");
        }
    
        @Override
        protected void onPause() {
            super.onPause();
            Log.d(TAG,"onPause");
        }
    
        @Override
        protected void onResume() {
            super.onResume();
            Log.d(TAG,"onResume");
        }
    }
    
    

    在onCreate()方法中,我们分别为两个按钮注册了点击事件,点击第一个按钮会启动NormalActivity,点击第二个按钮会启动DialogActivity。然后在Activity的7个回调方法中分别打印了一句话,这样就可以通过观察日志的方式来更直观地理解活动的生命周期。

    在这里插入图片描述
    启动程序时的打印日志
    在这里插入图片描述

    可以看到,当MainActivity第一次被创建时会依次执行onCreate()、onStart()和onResume()方法。

    然后点击第一个按钮,启动NormalActivity
    在这里插入图片描述
    由于NormalActivity已经把MainActivity完全遮挡住,因此onPause()和onStop()方法都会得到执行。
    然后按下Back键返回MainActivity
    在这里插入图片描述由于之前MainActivity已经进入了停止状态,所以onRestart()方法会得到执行,之后又会依次执行onStart()和onResume()方法。注意此时onCreate()方法不会执行,因为MainActivity并没有重新创建。

    然后再点击第二个按钮,启动DialogActivity
    在这里插入图片描述
    在这里插入图片描述
    可以看到,只有onPause()方法得到了执行,onStop()方法并没有执行,这是因为DialogActivity并没有完全遮挡住MainActivity,此时MainActivity只是进入了暂停状态,并没有进入停止状态。
    相应地,按下Back键返回MainActivity也应该只有onResume()方法会得到执行
    在这里插入图片描述
    最后在MainActivity按下Back键退出程序
    在这里插入图片描述
    依次会执行onPause()、onStop()和onDestroy()方法,最终销毁MainActivity。

    参考资料:《第一行代码:Android》

    cs