Activity生命周期各情景分析

版权声明:允许转载,只要标注转载地址即可 https://blog.csdn.net/z979451341/article/details/64440408

首先介绍一下各个生命周期函数的含义

onCreate:负责创建Activity和相关配置,还有布局的初始化
onStart:这个时候我们可以看到Activity的界面,但还不能与用户交互
onResume:现在可以与用户交互
onPause:Activity被部分遮挡,Activity不能与用户交互,与onResume相对
onStop:完全Activity不可见,但是Activity还存活,与onStart相对
onDestroy:销毁Activity

一.在默认activity配置下,各个生命周期函数的调用时间

1.这个应用只有一个Activity A

我们打开应用,生命周期运行的流程就是
onCreate-》onStart-》onResume

如果我们再点击home键,跳转到主界面,这个时候Activity还没有死
onPause-》onStop

我们再点击应用图标返回Activity
onRestart-》onStart-》onResume

这个时候我们点击返回键,Activity销毁,应用关闭
onPause-》onStop-》onDestroy

2.一个应用有两个Activity:A,B。

打开应用启动Activity A,然后跳转Activity B,打印的log如下,这里要注意 A onPause发生在B onCreate前面,B onResume发生在A Stop之前。就像A通知自己界面要显示B了,然后B初始化完成回调通知A,A再做一些结尾的工作。
A onCreate -》A onStart-》A onResume-》A onPause-》B onCreate-》B onStart-》B onResume-》A onStop

然后我们点击两次返回键,依次销毁B和A,这里要注意Activity A从不可见到可见的生命周期变化。这也和上一次的类似,先通知自己,然后等回调再做一些结尾的工作。
B onPause-》A onRestart-》A onStart-》A onResume-》B onStop-》B onDestroy-》A onPause-》A onStop-》A onDestroy

3.横竖屏切换

首先说一下onConfigurationChanged方法,他是用来监听activity配置变化的,比如横竖屏切换

(1)首先在默认配置的情况下,如果一个activity竖屏切换到横屏
onConfigurationChanged
onPause
onStop
onDestroy
onCreate
onStart
onResume

而且在切换回竖屏时,生命周期也是这么变化。

(2)如果在AndroidManifest里给该activity添加这段代码,则横竖屏切换,生命周期不受到影响,onConfigurationChanged会执行

android:configChanges="screenSize|keyboardHidden|orientation"

(3)如果换成一下代码,则是竖屏切换横屏,生命周期像第一种情况一样,销毁重建,但是横屏回复竖屏,则生命周期不受影响,但是onConfigurationChanged方法会执行

android:configChanges="orientation"

(4)如果换成以下代码,则和情况3一样

android:configChanges="orientation|keyboardHidden"

4.应用弹出对话框

如果对话框是AlertDialog等是Dialog子类的,那生命周期不会变化,因为这个对话框的界面可以说是直接嵌入当前Activity布局里,不算是遮挡Activity,因为这个些Dialog都是接受了当前Activity的实例,比如下面的

                final AlertDialog.Builder normalDialog =
                        new AlertDialog.Builder(MainActivity.this);
                normalDialog.setTitle("我是一个普通Dialog");
                normalDialog.setMessage("你要点击哪一个按钮呢?");
                normalDialog.setPositiveButton("确定",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //...To-do
                            }
                        });
                normalDialog.setNegativeButton("关闭",
                        new DialogInterface.OnClickListener() {
                            @Override
                            public void onClick(DialogInterface dialog, int which) {
                                //...To-do
                            }
                        });
                // 显示
                normalDialog.show();

如果我们是将一个Activity的style设置为android:theme=”@android:style/Theme.Dialog”,然后把布局大小设置一下

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="200dp"
    android:layout_height="200dp"
    tools:context="com.example.zth.myapplication.MainActivity"
    android:orientation="vertical">

    <Button
        android:id="@+id/btn"
        android:text="跳转到MainActivity"
        android:gravity="center"
        android:layout_width="match_parent"
        android:layout_height="wrap_content" />
</LinearLayout>

现在我们再开启应用,首先打开Activity A,然后跳转Activity B,注意这里A 触发了onPause
A onCreate-》A onStart-》A onResume -》A onPause -》B onCreate -》B onStart -》B onResume

再点击返回键关闭Activity B
B onPause-》A onResume-》B onStop-》B onDestroy

5.onNewIntent
这个是在重用activity会触发,就是比如MainActivity和TwoActivity都是singleTask启动模式,然后MainActivity跳TwoActivity,TwoActivity再跳回来(PS:如果MainActivity在后台太久或者手机内存不够,把MainActivity杀死了,那会触发onCreate,重新分配资源,回复状态)

Main: onCreate
Main: onStart
Main: onResume
Main: onPause
Two: onCreate
Two: onStart
Two: onResume
Main: onStop
Two: onPause
Main: onNewIntent
Main: onRestart
Main: onStart
onResume
Two: onStop
onDestroy

二.Activity的启动模式

activity的启动模式来决定,启动一个activity时,是否创建新的activity栈,是否创建的新的activity,还是使用原来的activity

activity栈管理activity的显示,你退出一个activity时,一般会显示上一个activity,这个由activity栈来控制,因为是栈所以先进后出,在栈顶的activity就会被显示,能够与用户交互

(1)standard
Activity启动模式是默认是standard,启动的时候不管之前是否创建过,都创建一个新的,现在Activity A点击按钮启动自己
MainActivity@5a2473fA onCreate
MainActivity@5a2473fA onStart
MainActivity@5a2473fA onResume
MainActivity@5a2473fA onPause
MainActivity@ce09288A onCreate
MainActivity@ce09288A onStart
MainActivity@ce09288A onResume
MainActivity@5a2473fA onStop

(2)singleTop
把A的启动模式设置为singleTop,然后自己启动自己,只是把自己拿出来显示或者说是刷新了一下自己

MainActivity@5a2473fA onCreate
MainActivity@5a2473fA onStart
MainActivity@5a2473fA onResume
MainActivity@5a2473fA onPause
MainActivity@5a2473fA onResume

如果是三个activity,TwoActivity跳转到ThreeActivity,ThreeActivity跳转到FourActivity,FourActivity跳转到TwoActivity。情况和是standard没区别

TwoActivity onCreate
TwoActivity onStart
TwoActivity onResume
TwoActivity onPause
ThreeActivity onCreate
ThreeActivity onStart
ThreeActivity onResume
TwoActivity onStop
ThreeActivity onPause
FourActivity onCreate
FourActivity onStart
FourActivity onResume
ThreeActivity onStop
FourActivity onPause
TwoActivity onCreate
TwoActivity onStart
TwoActivity onResume
FourActivity onStop

(3)singleTask
如果启动模式是SingleTask,启动某个activity如果activity回退栈里有该activity,就直接将前面的activity全部清除,这样该activity就在栈的顶部也就才成为前台activity,否者就新建一个

如果是三个activity,TwoActivity跳转到ThreeActivity,ThreeActivity跳转到FourActivity,FourActivity跳转到TwoActivity。则发现在FourActivity跳转到TwoActivity时,首先ThreeActivity被销毁,然后显示TwoActivity,最后FourActivity也被销毁,这一来TwoActivity就在activity栈栈顶。

TwoActivity onCreate
TwoActivity onStart
TwoActivity onResume
TwoActivity onPause
ThreeActivity onCreate
ThreeActivity onStart
ThreeActivity onResume
TwoActivity onStop
ThreeActivity onPause
FourActivity onCreate
FourActivity onStart
FourActivity onResume
ThreeActivity onStop
ThreeActivity onDestroy
FourActivity onPause
TwoActivity onRestart
TwoActivity onStart
TwoActivity onResume
FourActivity onStop
FourActivity onDestroy

(4)singleInstance
然后singleInstance启动一个未创建的Activity会为他创建一个新的栈再把新创建的Activity放入其中,后面再启动这些activity会进行复用

如果是三个activity,TwoActivity跳转到ThreeActivity,ThreeActivity跳转到FourActivity,FourActivity跳转到TwoActivity。

TwoActivity onCreate
TwoActivity onStart
TwoActivity onResume
TwoActivity onPause
ThreeActivity onCreate
ThreeActivity onStart
ThreeActivity onResume
TwoActivity onStop
ThreeActivity onPause
FourActivity onCreate
FourActivity onStart
FourActivity onResume
ThreeActivity onStop
FourActivity onPause
TwoActivity onRestart
TwoActivity onStart
TwoActivity onResume
FourActivity onStop

总结:onStart与onStop是一对,针对Activity是否显示(部分显示也算是显示),onResume与onPause是一对,针对是否可以与用户交互。

最后贴一张Activity与Fragment生命周期的图,这里还有一篇Fragment生命周期的博客https://blog.csdn.net/z979451341/article/details/79878458

这里写图片描述

猜你喜欢

转载自blog.csdn.net/z979451341/article/details/64440408