Activity的生命周期和启动模式详解

AI权益加码!Claude Code、Cursor等20+工具免费用! 购周边限加赠Coding Plan Lite,畅享主流AI工具!学习进阶更高效! 阅读详情

Activity生命周期经典图解:


按键对生命周期的影响:

BACK键:

  当我们按BACK键时,我们这个应用程序将结束,这时候我们将先后调用onPause()->onStop()->onDestory()三个方法。

再次启动App时,会执行onCreate()->onStart()->onResume()

HOME键:

  当我们打开应用程序时,比如浏览器,我正在浏览NBA新闻,看到一半时,我突然想听歌,这时候我们会选择按HOME键,然后去打开音乐应用程序,而当我们按HOME的时候,Activity先后执行了onPause()->onStop()这两个方法,这时候应用程序并没有销毁。

而当我们从桌面再次启动应用程序时,则先后分别执行了onRestart()->onStart()->onResume()三个方法。

一般Activity切换正常生命周期(这里的一般是指启动模式为standard,切换activity时没有加flag标志):

ActivityA启动ActivityB:

ActivityA 的生命周期onPause()->onStop(),

ActivityB的生命周期onCreate()->onStart()->onResume()。

ActivityB执行finish返回ActivityA:

ActivityB的生命周期onPause()->onStop()->onDestory()

ActivityA的生命周期了onRestart()->onStart()->onResume()

注意:当ActivityB定义为Dialog样式时,ActivityA的生命周期是不一样的,

我们给ActivityB加上theme

  <style name="MyDialogStyle">
        <item name="android:windowBackground">@android:color/transparent</item>
        <item name="android:windowFrame">@null</item>
        <item name="android:windowNoTitle">true</item>
        <item name="android:windowIsFloating">true</item>
        <item name="android:windowIsTranslucent">true</item>
        <item name="android:windowContentOverlay">@null</item>
        <item name="android:windowAnimationStyle">@android:style/Animation.Dialog</item>
        <item name="android:backgroundDimEnabled">true</item>
    </style>

这个时候,ActivityA启动ActivityB,B没有完全遮挡A,ActivityB的生命周期跟刚才一样,但是ActivityA并没有执行onStop()

还有一点需要特别注意,Activity中直接弹dialog,Acitivity的生命周期是不会变化的。网上有些说法是会执行onPause(),其实并没有执行!

另外还有几个跟生命周期相关的方法

  @Override
    protected void onNewIntent(Intent intent) {
        super.onNewIntent(intent);
    }

    @Override
    protected void onSaveInstanceState(Bundle outState) {
        super.onSaveInstanceState(outState);
    }

    @Override
    protected void onRestoreInstanceState(Bundle savedInstanceState) {
        super.onRestoreInstanceState(savedInstanceState);
    }
	
    @Override
    public void onConfigurationChanged(Configuration newConfig) {
        super.onConfigurationChanged(newConfig);
    }



当应用运行起来后就会开启一条线程,线程中会运行一个任务栈,当Activity实例创建后就会放入任务栈中。Activity启动模式的设置在AndroidManifest.xml文件中,通过配置Activity的属性android:launchMode=""设置。

1. Standard模式(默认)

我们平时直接创建的Activity都是这种模式的Activity,这种模式的Activity的特点是:只要你创建了Activity实例,一旦激活该Activity,则会向任务栈中加入新创建的实例,退出Activity则会在任务栈中销毁该实例。
standard模式是所启动的Activity都是在同一个task容器栈下,不会重新创建新的task容器栈。先压入栈的Activity实例按顺序入栈底,后入栈在栈顶,处于栈的顶部Activity实例处于活动状态,其他处于非活动状态。按物理返回键,退出当前所处活动状态Activity窗口,这样就会从task容器栈中弹出,显示在手机主屏幕上,从而,有非活动状态转换成活动的状态。其次,standard容器栈可能会存在着相同的Activity实例,只有没调用一次startActivity方法,就会创建目标Activity实例对象压入task容器栈。
如果Activity启动顺序为A->B->B->A->D,栈中的Acitivy为ABBAD(最先创建的A位于栈底,最后创建的D位于栈顶)

2. SingleTop模式

这种模式会考虑当前要激活的Activity实例在任务栈中是否正处于栈顶,如果处于栈顶则无需重新创建新的实例,会重用已存在的实例,否则会在任务栈中创建新的实例。
SingleTop有个不错的用法是防止多次点击创建多个Activity,无论start几次,SingleTop模式能保证栈顶只有一个实例。 如果Activity启动顺序为A->B->B->A->D,栈中的Acitivy为ABAD(当B位于栈顶时,再次启动B的时候,B不会重新创建)

3. SingleTask模式

如果任务栈中存在该模式的Activity实例,则把栈中该实例以上的Activity实例全部移除,调用该实例的newInstance()方法重用该Activity,使该实例处於栈顶位置,否则就重新创建一个新的Activity实例。
singletask模式,特别需要注意了。启动的目标Activity实例如果已经存在task容器栈中,不管当前实例处于栈的任何位置,是栈顶也好,栈底也好,还是处于栈中间,只要目标Activity实例处于task容器栈中,都可以重用该Activity实例对象,然后,把处于该Activity实例对象上面全部Activity实例清除掉,并且,task容器栈中永远只有唯一实例对象,不会存在两个相同的实例对象。所以,如果你想你的应用不管怎么启动目标Activity,都只有唯一一个实例对象,就使用这种启动模式。 如果Activity启动顺序为A->B->B->A->D,栈中的Acitivy为AD(当A再次被启动时,A会被移到栈顶,位于A上面的Acitivity全部会出栈)

4. SingleInstance模式

当该模式Activity实例在任务栈中创建后,只要该实例还在任务栈中,即只要激活的是该类型的Activity,都会通过调用实例的newInstance()方法重用该Activity,此时使用的都是同一个Activity实例,它都会处于任务栈的栈顶。此模式一般用于加载较慢的,比较耗性能且不需要每次都重新创建的Activity。
singleInstance启动模式,简单说就是可以共享某个Activity。比如,应用1的任务容器栈中创建了MainActivity实例,应用2也要激活MainActivity,则不需要创建MainActivity实例,直接可以公用MainActivity实例。 尤其值得注意:应用1启动MainActivity,按home键;打开应用2启动应用1的MainActivity实例。在按home键,打开应用1,这时候应用1的界面是应该是处于MainActivity界面实例。 SingleInstance的一个任务栈中只有一个Activity,并保证不再有其他Activity实例进入。

特别需要注意的生命周期onNewIntent
当一个Activity被start,而不需要重新创建时,就会执行onNewIntent生命周期。如果一个Activity的启动模式是SingleTask,我们可以在onNewIntent中执行一些刷新操作等。
我们一般会把MainAcitivy设置为SingleTask,除了保证MainActivity的唯一,还可以利用singleTask的特性做一些清理工作。自动管理栈,销毁无用的Acitivity.

Intent Flags 

Flags: 表示Intent的标志位,常用于Activity的场景中,它和Activity的启动模式有着密切的联系。
下面列举的是和本文主题相关的Flags属性:

Intent.FLAG_ACTIVITY_NEW_TASK (默认)

默认的跳转类型,它会重新创建一个新的Activity,不过与这种情况,比如说Task1中有A,B,C三个Activity,此时在C中启动D的话,如果在AndroidManifest.xml文件中给D添加了Affinity的值和Task中的不一样的话,则会在新标记的Affinity所存在的Task中压入这个Activity。如果是默认的或者指定的Affinity和Task一样的话,就和标准模式一样了启动一个新的Activity.

FLAG_ACTIVITY_SINGLE_TOP

这个FLAG就相当于启动模式中的singletop,例如:原来栈中结构是A B C D,在D中启动D,栈中的情况还是A,B,C,D。

FLAG_ACTIVITY_CLEAR_TOP

这个FLAG就相当于启动模式中的SingleTask,这种FLAG启动的Activity会把要启动的Activity之上的Activity全部弹出栈空间。例如:原来栈中的结构是A B C D ,从D中跳转到B,栈中的结构就变为了A B了。

FLAG_ACTIVITY_BROUGHT_TO_FRONT

这个网上很多人是这样写的。如果activity在task存在,拿到最顶端,不会启动新的Activity。这个有可能会误导大家! 他这个FLAG其实是这个意思!比如说我现在有A,在A中启动B,此时在A中Intent中加上这个标记。此时B就是以FLAG_ACTIVITY_BROUGHT_TO_FRONT方式启动,此时在B中再启动C,D(正常启动C,D),如果这个时候在D中再启动B,这个时候最后的栈的情况是 A,C,D,B。如果在A,B,C,D正常启动的话,不管B有没有用FLAG_ACTIVITY_BROUGHT_TO_FRONT启动,此时在D中启动B的话,还是会变成A,C,D,B的。

FLAG_ACTIVITY_NO_USER_ACTION

onUserLeaveHint()作为activity周期的一部分,它在activity因为用户要跳转到别的activity而要退到background时使用。比如,在用户按下Home键,它将被调用。比如有电话进来(不属于用户的选择),它就不会被调用。
那么系统如何区分让当前activity退到background时使用是用户的选择?
它是根据促使当前activity退到background的那个新启动的Activity的Intent里是否有FLAG_ACTIVITY_NO_USER_ACTION来确定的。
注意:调用finish()使该activity销毁时不会调用该函数

FLAG_ACTIVITY_NO_HISTORY

意思就是说用这个FLAG启动的Activity,一旦退出,它不会存在于栈中,比如原来是A,B,C这个时候再C中以这个FLAG启动D的,D再启动E,这个时候栈中情况为A,B,C,E。

Activity相关属性taskAffinity

Activity 中的 android:taskAffinity 这个属性介绍:
Activity为Task拥有的一个affinity。拥有相同的affinity的Activity理论上属于相同的Task(在用户的角度是相同的“应用程序”)。Task的affinity是由它的根Activity决定的。 
affinity决定两件事情——Activity重新宿主的Task(参考allowTaskReparenting特性)和使用FLAG_ACTIVITY_NEW_TASK标志启动的Activity宿主的Task。
默认情况,一个应用程序中的所有Activity都拥有相同的affinity。捏可以设定这个特性来重组它们,甚至可以把不同应用程序中定义的Activity放置到相同的Task中。为了明确Activity不宿主特定的Task,设定该特性为空的字符串。

如果这个特性没有设置,Activity将从应用程序的设定那里继承下来(参考<application>元素的taskAffinity特性)。应用程序默认的affinity的名字是<manifest>元素中设定的package名。


欢迎扫描二维码,关注公众号


(二)Android-Activity生命周期启动模式详解 本文是一份面向Android初学者的Activity学习指南,重点讲解了Activity生命周期启动模式。文章首先通过形象比喻(如将Activity比作书页或幻灯片)解释Activity概念,并区分Activity与View的关系。然后详细剖析了七大生命周期方法(onCreate、onStart、onResume、onPause、onStop、onDestroy、onRestart)的调用机、用途注意事项,配合代码示例说明每个方法的典型使用场景。最后通过流程图直观展示了Activity从创建到销毁的完 阅读详情

相关推荐

Activity A页面启动Activity B页面的生命周期顺序(多种情况)

1. A启动完成,在A中启动B a. A-onCreate() b. A-onStart() c. A-onResume() ----启动B---- d. A-onPause() e. B-onCreate() f. B-onStart() g. B-onResume() h. A-onStop() 2. 紧接1状态,B启动A a. B-onPause() b. A-onCreate() c. A-onStart() d. A-onResume() e. B-onStop()

一碗单炒饭的专栏 2197

Activity启动模式详解

系统默认的启动模式,即便实例存在,每次启动都会创建一个新的实例,每个实例可以属于不同的任务栈。若ActivityA以此模式启动ActivityB,那么B会进入A所在的栈。注意,若是非Activity类型的Context,如ApplicationContext,并没有任务栈,因此以ApplicationContext启动Standard模式的Activity会报错。我们可以在启动创建一个新的任务栈,指定FLAG_ACTIVITY_NEW_TASK标记位。

it_xushixiong的博客 304

AndroidActivity生命周期分析:从AActivity 到BActivity过程分析

A启动B  A生命周期全过程 1.启动A 生命周期Activity--A: onCreate---->调用成功 生命周期Activity--A: onStart---->调用成功 生命周期Activity--A: onResume---->调用成功 2.在A中启动B 生命周期Activity--A: onPause---->调用成功 生命周期Activity--B: o

Liyunlong 1500

Android从A到B生命周期,Activity生命周期函数调用顺序——从A跳转至B后,在B中按下返回键...

之前面试被问过这样一个问题ActivityA中点击按钮跳转至ActivityB,之后在ActivityB界面中按下Back(返回)键,描述整个过程的生命周期函数调用情况。面试完之后就自己写了个小Demo来详细了解一下。项目里有两个Activity:MainActivityActivityTwo;MainActivity中有一个按钮可跳转至ActivityTwo。以下是启动应用后的Log信息:从A...

weixin_39602976的博客 1618

AActivity启动BActivity生命周期的执行顺序

1)Activity生命周期 onCreat() 每个活动中我们都会重写这个方法,他会在活动第一次被创建调用。一般我们在这个方法中会完成活动的初始化操作,例如加载布局、绑定事件等。 onStart()在活动由不可见变为可见调用。 onResume()在活动准备好用户进行交互的候调用。此的活动一定位于返回栈的栈顶,并且处于运行状态。 onPause()在系统准备去启动或者...

清醒的博客 1901

Activity生命周期启动模式详解

Activity生命周期启动模式

lentolove的博客 3380

activity生命周期启动模式详解

Activity生命周期详解activity数据保存恢复

qq_41692931的博客 772

Android Activity生命周期启动模式详解

Android Activity生命周期启动模式详解Activity生命生命周期主要从两个方面来总结:生命周期总览(自己画的图片,丑一些):正常情况下的生命周期: Activity启动到运行经过onCreate-->onStart()-->onResume,onCreate的候不可见,到onStart的Activity已经是可见的了. 当Activity失去焦点但是仍然可见的候会调用on

Brioal Is Hardworking 2824

Activity生命周期详解+面试 Activity启动模式

Activity生命周期中分为三态度:运行态,暂停态停止态; 1.运行态: 当Activity在屏幕的最前面,就是你可以看到的,有焦点的那个界面(有焦点:你可以在上面点击触摸的,用户可以用来操作的).处于运行态的Activity,Android会尽可能的保持他的运行,即便出现了内存不足的候,android系统也会先把栈底的Activity杀死,确保可见的Activity正常运行. 2

癫狂的痴迷 4886

详解Activity生命周期启动模式

Activity生命周期分为两类,一部分是典型情况下的生命周期,所谓典型就是在用户的参与下Activity所经过的生命周期的改变。另一部分就是异常情况下的生命周期,也就是被系统回收,或者由于当前系统configuration配置的改变而导致Activity销毁重建。 1.典型情况下的生命周期的分析: 在正常情况下Activity要经历一下生命周期: -onCreate(Activity正在

TonyStonnem的博客 440

运行android程序显示stop,Android Activity生命周期启动模式详解

Android Activity生命周期启动模式详解Activity生命生命周期主要从两个方面来总结: 生命周期总览(自己画的图片,丑一些): 正常情况下的生命周期:Activity生命周期可以成对的来记忆:1.onCreateonDestory是一对,标识着Activity的创建与销毁2.onStartonStop是一对,标识着Activity的开始可见与不可见3.onResumeon...

weixin_33483304的博客 859

Activity详解Activity的使用步骤、生命周期及其启动模式启动方法

我们先来学习一下Activity的基础知识: Activity应用程序的表现层,应用程序中可以包含多个Activity,它们之间可以相互跳转,来达到手机屏幕的切换。Activity通过View来实现应用程序的图形用户界面GUI,手机用户直接通过GUI应用程序进行交互,应用程序通过GUI向用户显示信息,用户通过GUI向应用程序发出指令响应。Activity的使用步骤: 1.创建Acti

fbfkjgh的博客 3万+

Activity生命周期,数据传递,启动模式详解

Activity相关包括Activity生命周期详解Activity之间的数据传递,启动模式等。

Coding... 616

Activity 生命周期启动模式 详解

一、生命周期关于生命周期的文章太多了,记住理解下面这张图就足够了,也可以自己写个简单程序看log加深理解。 关于Activity 启动的源码有点复杂,涉及Instrumentation、ActivityThread、ActivityManagerService等等。 下面是总结的几点经验: 其实主要理解在异常情况下的生命周期:1、在新的Activity启动之前,栈顶的Activity需要先执行

大风--心有猛虎,细嗅蔷薇。 782

activity详解生命周期启动模式

activity简介: activityandroid四大组件之一,另外三个是Service、BroadCastReceiver、ContentPrrivider);activityandroid中使用最为频繁的组件之一。中文翻译为活动,但我觉得把它看作界面更为合适。下面我们先来看一下activity的基础知识。 二 activity基础知识: 1:使用avtivity    (1

u014720313的博客 578
上一篇: Android进程分类与管理
下一篇: 算法系列(十一)BASE64算法实现和使用说明
robert_chao
博客等级 码龄15年 265粉丝 119原创
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值