Android activity的启动模式和生命周期

一、Activity的启动模式有四种:standard(默认)、singleTop(栈顶复用)、singleTask(栈内复用)、singleInstance(单例模式)

使用方法:

在清单文件中声明 Activity 时,可以使用 < activity> 元素的 launchMode 属性指定 Activity的启动模式

1.standard:默认的标准启动方式,Activity可以被多次实例化,创建多个Activity实例。(被启动的activity与启动的activity在同一个任务栈

注意:用ApplicationContext去启动standard模式的Activity会报错,这是因为此模式的Activity默认会进入启动它的Activity所属的任务栈中,而非Activity类型的Context并有没有任务栈。

解决办法:启动Activity时指定FLAG_ACTIVITY_NEW_TASK即可

2.singleTop:如果栈顶已经有该实例,那么就会复用,并调用onNewIntent()方法。如果不在栈顶,则会创建。(被启动的activity与启动的activity在同一个任务栈

3.singleTask:Intent.FLAG_ACTIVITY_NEW_TASK效果相同,只允许一个栈中只存在一个该Activity的实例,如果栈中没有该Activity的实例,则会创建。如果栈中已经存在,系统会销毁在这之上的所有Activity,让该Activity实例置于栈顶,并调用onNewIntent()方法。(Activity所在的任务栈为taskAffinity设置的栈名,若没有设置,则任务栈为该Activity所在进程的包名)

4.singleInstance:只在一个独立的任务栈中,并且这个任务栈中有且只有这一个实例。重复启动该Activity时,会重用已存在的任务和实例,并调用onNewIntent()。(Activity所在的任务栈为taskAffinity设置的栈名,若没有设置,则任务栈为该Activity所在进程的包名。若该应用有多个Activity,且都没有设置taskAffinity时,则启动每一个Activity 都创建一个新的任务栈,任务栈的栈名都是应用包名,但是有不同的任务栈id)

singleInstance和singleTask的区别:

        1.singleInstance在系统中只会存在一个实例,而singleTask模式的Activity可以有多个实例(在不同的任务栈中)。

        2.多个应用启动同一个singleInstance的Activity,都会重用已经启动的实例。

二、生命周期:

Activity完整的生命周期:onCreate()->onStart() ->onResume() ->onPause() ->onStop()->onDestory()

1.息屏再重新亮屏,或者按下Home键,再重新进入应用时(应用没被杀后台的前提下)。

        onPause() -> onStop() -> onRestart() ->onStart() ->onResume()

        这种情况下,与启动模式无关

2.假设Activity A位于栈顶,此时再启动Activity A。

        ①启动模式是 Standard:

        生命周期:onPause() ->onCreate()->onStart() ->onResume() ->onStop()

        ②启动模式是 SingleTop、SingleTask 或者 SingleInstance的话:

        生命周期:onPause() -> onNewIntent() -> onResume()

  • 22
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Activity启动模式Android应用程序中非常重要的概念,它决定了Activity启动方式和生命周期的管理方式。在Android中,Activity启动模式主要有以下几种: 1. standard:标准模式。默认情况下,每次启动Activity时都会创建一个新实例,并放入任务栈中。如果该Activity已经存在任务栈中,则会将该Activity放到栈顶,并重新调用其onCreate()方法。 2. singleTop:栈顶复用模式。如果新启动Activity已经存在任务栈的栈顶,则不会创建新实例,而是将已有的实例作为当前任务的Activity,并调用其onNewIntent()方法。如果新启动Activity不在栈顶,则会创建新实例,并将其放到任务栈的栈顶。 3. singleTask:栈内复用模式。如果新启动Activity已经存在任务栈中,则不会创建新实例,而是将已有的实例作为当前任务的Activity,并将其上面的Activity全部出栈,调用其onNewIntent()方法。如果新启动Activity不存在任务栈中,则会创建新实例,并放到任务栈的栈顶。 4. singleInstance:单例模式。在一个新的任务栈中创建Activity,并且该任务栈中只有该Activity实例。如果该Activity已经存在于其他任务栈中,则会将该任务栈中的该Activity实例移动到新的任务栈中。 下面是Activity的源码分析: 1. standard模式Activity的源码中,标准模式是默认的启动模式。当我们使用startActivity()方法启动一个Activity时,会调用ActivityStackSupervisor类中的startActivityLocked()方法。在该方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈。如果存在,则会将当前Activity放到该任务栈的栈顶,并调用其onCreate()方法。如果不存在,则会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。 2. singleTop模式 当我们在Manifest文件中设置Activity启动模式为singleTop时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈,并判断当前Activity是否在栈顶。如果在栈顶,则会调用其onNewIntent()方法。如果不在栈顶,则会创建一个新的实例,并放到该任务栈的栈顶。 3. singleTask模式 当我们在Manifest文件中设置Activity启动模式为singleTask时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会通过ActivityStack类的findTaskLocked()方法查找是否存在当前Activity所在的任务栈。如果存在,则会找到该任务栈中的栈顶Activity,并将其上面的所有Activity出栈。然后将当前Activity放到该任务栈的栈顶,并调用其onNewIntent()方法。如果不存在,则会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。 4. singleInstance模式 当我们在Manifest文件中设置Activity启动模式为singleInstance时,会在ActivityInfo中保存该信息。在ActivityStackSupervisor类的startActivityLocked()方法中,会创建一个新的任务栈,并将当前Activity放到该任务栈的栈顶。如果该Activity已经存在于其他任务栈中,则会将该任务栈中的该Activity实例移动到新的任务栈中。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值