Activity生命周期和启动模式

Activity生命周期和启动模式

  • 启动Activity: onCreate()——onStart() ——onResume() ,Activity 进入运行状态。
  • Activity退居后台:当前Activity转到新的Activity界面或者Home键回到主屏:onPause()——onstop(),进入停滞状态。
  • Activity返回前台,onRestart()——onStart()——onResume(),再次回到运行状态。
  • Activity退居后台,且系统内存不足,系统会杀死这个后台状态的Activity(此时这个Activity引用仍然处在任务栈中,只是这个时候引用指向的对象已经为null),若再次回到这个Activity,则会走onCreate()——onStart()——onResume()将重新走一次Activity的初始化生命周期。
  • 锁屏 : onPause()——onStop()
  • 解锁:onStart()——onResume()

生命周期图

Activity 启动模式
通过Acitivty的xml标签来改变任务栈的默认行为

  • 使用android:launchMode=”standard|singleInstance|singleTask|singleTop”来控制Acivity任务栈。

任务栈是一种后进先出的结构。位于栈顶的Activity处于焦点状态,当按下back按钮的时候,栈内的Activity会一个一个的出栈,并且调用其onDestory()方法。如果栈内没有Activity,那么系统就会回收这个栈,每个APP默认只有一个栈,以APP的包名来命名.

  • standard : 标准模式,每次启动Activity都会创建一个新的Activity实例,并且将其压入任务栈栈顶,而不管这个Activity是否已经存在。Activity的启动三回调(onCreate()->onStart()->onResume())都会执行。
  • singleTop : 栈顶复用模式.这种模式下,如果新Activity已经位于任务栈的栈顶,那么此Activity不会被重新创建,所以它的启动三回调就不会执行,同时Activity的onNewIntent()方法会被回调.如果Activity已经存在但是不在栈顶,那么作用与standard模式一样.
    详细讲解SingleTop模式:

首先Module里有三个Activity 一个MainActivity 、ActivitySingleTop、ActivitySingleTask。每个页面包含三个Button 和一个textView。页面如下:

这里写图片描述

  1. 首先启动程序显示第一张图。日志如下(现在的顺序是MainActivity)

01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onCreate()
01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStart()
01-31 17:07:02.831 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onResume()

2.然后点击SingleTop启动SingleTop的Activity日志如下:(现在的顺序是MainActivity——ActivitySingleTop)

01-31 17:09:39.958 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onCreate()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStart()
01-31 17:09:40.038 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()
01-31 17:09:40.559 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()

3.当SingleTop类型的Activity处于栈顶再次启动SingTop类型的自己运行的生命周期如下(在ActivitySingleTop 页面点击SingleTop button):(现在的顺序是MainActivity——ActivitySingleTop——ActivitySingleTop)

01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onPause()
01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onNewIntent()
01-31 17:11:42.389 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()

当ActivitySingleTop处于栈顶,并且再次启动它,它执行了如下方法: onPause()、 onNewIntent()、onResume()

4.下面我们再来看它不在栈顶时的运行的情况。现在栈里只有MainActivity、ActivitySingleTop。所以现在我们需要在启动一个MainActivity。日志如下:

01-31 17:16:23.459 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onPause()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onCreate()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStart()
01-31 17:16:23.509 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onResume()
01-31 17:16:24.030 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStop()

5.现在栈里面有三个activity 分别是MainActivity、ActivitySingleTop、MainActivity 。并且MainActivity处于栈顶。下面我们在来看下再次点击SingTop 按钮,也就是再起启动ActivitySingleTop看下运行情况:

01-31 17:19:14.181 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onCreate()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onStart()
01-31 17:19:14.251 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTop: onResume()
01-31 17:19:14.772 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()

如上可以看出不在栈顶时,ActivitySingleTop重新创建了,执行了onCreate、onStart、onResume,现在栈里面应该是有四个Activity 分别是: MainActivity、 ActivitySingleTop、MainActivity、ActivitySingleTop
到这里SingleTop模式说完了。

  • singleTask:栈内复用模式.创建这样的Activity的时候,系统会先确认它所需任务栈已经创建,否则先创建任务栈.然后放入Activity,如果栈中已经有一个Activity实例,那么这个Activity就会被调到栈顶,onNewIntent(),并且singleTask会清理在当前Activity上面的所有Activity.(clear top)

    1.还是举上面的例子,一共有三个Activity,启动完MainActivity之后,启动ActivitySingleTask日志:

01-31 17:28:59.766 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onCreate()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onStart()
01-31 17:28:59.876 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()
01-31 17:29:00.377 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()

2.现在ActivitySingleTask处于栈顶,然后我们再一次启动它看看:

01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onPause()
01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onNewIntent()
01-31 17:29:55.085 30227-30227/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()

当ActivitySingleTask 处于栈顶,并且再次启动它时方法执行时: onPause、 onNewIntent、onResume

3.在启动一个MainActivity 那么栈里有MainActivity、ActivitySingleTask、MainActivity,接着我们在来启动ActivitySingleTask看下执行日志:

02-01 08:22:38.135 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onPause()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onNewIntent()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onRestart()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onStart()
02-01 08:22:38.145 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.ActivitySingleTask: onResume()
02-01 08:22:38.565 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onStop()
02-01 08:22:38.565 15173-15173/devstrongzhao.activitylaunchmode I/devstrongzhao.activitylaunchmode.MainActivity: onDestroy()

当ActivitySingleTask没有处在栈顶时,再次启动它,运行的方法有:onNewIntent()——onRestart()——onStart()——onResume(),而在原来在它上面的MainActivity则会被销毁:运行的方法有:onPause()——onStop()——onDestroy()
到这里SingleTask模式介绍完毕了。

  • singleInstance : 加强版的singleTask模式,这种模式的Activity只能单独位于一个任务栈内,由于栈内复用的特性,后续请求均不会创建新的Activity,除非这个独特的任务栈被系统销毁了
  • Activity的堆栈管理以ActivityRecord为单位,所有的ActivityRecord都放在一个List里面.可以认为一个ActivityRecord就是一个Activity栈

源码连接:https://github.com/EmperorZzl/ActivityLaunchMoudle

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值