首页 > 技术文章 > Activity生命周期和启动模式

danile97 2021-09-05 11:55 原文

一共七种状态,成对出现

 

 

onCreate()——onDestory()

onStart()——onStuop()

onResume()——onPause()

再加上一个官方文档中写的onRestart()

 

生命周期就是重写这些方法,在相应的方法(状态)里执行相应的操作就可以了

<1>onCreate和onDestory

——onCreate这个方法会在Activity启动的时候被调用

在这个启动的阶段,也就是在这个方法的内部,你可以去做一些初始化的动作

就是前面我们说到的初始化控件,初始化事件之类的

在这个方法里,也应该通过setContentView这个方法来设置Activity加载的UI内容

使用findViewById来找到这个UI里的各控件

——onDestory中一般执行一些释放资源的操作,同样要注意不要在这里面保存数据,因为这个步骤有可能被跳过,保存数据不安全

 

<2>onStart和onStop

onStart()是可见的,onStop()不可见

——onStart方法中一般较少设置事件

——onStop方法有些情况下可能不会被执行,比如说切换到另一个界面,但是另一个界面是透明的,所以原界面还是能被看见的,这时候就只会onPause()而不会onStop();还有可能当前系统的内存不足以运行当前的Activity的时候,就会调用onPause()方法而不调用onStop()方法

所以在onStop()方法中不要进行一些保存数据的操作,可能会不安全

 

<3>onResume和onPause

——onResume方法中一般用于放一些开始动画

——onPuse方法中一般进行保存正在编辑的数据,停止动画等操作

 

<4>

onStart()可见,但是没有焦点,没有获取到焦点,不可以进行操作

onResume()可见,并且获取到了焦点,可以进行操作,可以交互

onPause(),可见,但失去了焦点,暂停,不可操作

onStop()已经不可见了

 

一般情况下,onStart和onResume成对出现,onPause和onStop成对出现,例如从主界面跳转到另外一个界面

应该是主界面首先onPause(),onStop(),然后切换回主界面时onStart(),onResume()

但在某些情况下,例如第二个界面是透明的,那么我们虽然切换到了第二个界面,我们还是可以看见主界面的内容,只是不能进行操作

这种情况下主界面切换时就只会onPause(),切换回来时onResume()

 

<5>横竖屏切换时Activity生命周期的变化

当手机屏幕横竖屏进行切换时,会产生以下操作

onPause()

onStop()

onDestory()

onCreate()

onStart()

onResume()

也就是说Activity会先销毁掉,然后再重新创建

例如,我们一开始在播放器看视频,途中手机切换一下横竖屏,这个时候就相当于创建了一个新的Activity对象,这个对象的值如果不做处理的话,是相对于一个全新的界面,是不同于横竖屏切换之前的状态的

 

——如何解决横竖屏切换带来的问题呢?

1,禁止旋转,锁定屏幕的方向(常用于游戏开发)

在配置文件Manifest.xml中配置,把要设定为横屏或竖屏锁定的界面Activity中加入一条语句

android:screenOrientation=“ ”(填入portrait就是竖屏,landscape就是横屏)

 

 

2,设定界面对配置不敏感(常用于视频播放器开发)

在配置文件Manifest.xml中配置

 

 configChanges后面的这三个选项通常一起使用,意思就是隐藏键盘,屏幕尺寸变化,屏幕方向

——这两种方式都保证了在旋转屏幕的过程中不会销毁原有对象,不需要重走一遍生命周期

 

在开发中,需要遇到横竖屏切换的场景有:

1,游戏开发,游戏时会用到横屏

2,视频播放器

3,其他使用场景

 

<6>Activity启动模式

Activity一共有四种启动模式

我们在自己编写界面的时候,自己编写的xxxActivity其实都是直接或间接地继承自Activity,而Activity由系统创建启动的时候,由四种模式,分别是:

1,standard——标准模式

2,singleTop——单一栈顶模式

3,singleTask——单任务模式

4,singleInstance——单例模式

 

我们要设置Activity的启动模式,具体操作就是在配置清单Manifest.xml里的activity声明中配置加载模式(LaunchMode)即可

 

 

(1)Standard模式;

最基本的启动模式,每一次点击就会在任务栈中新加入一个任务,新打开一个界面

点击了多少下任务按钮,就会新建多少个新界面

在返回的时候,也需要按相应次数的返回按钮才能退出程序

使用场景——一般都是用这个模式,如果不进行配置,默认也是这种模式

 

(2)SingleTop模式:

如果任务栈的栈顶已经是当前要执行的任务了,那么就不会再创建新的任务

使用场景——如果想保证某个任务只有一个,不被创建多个,就可以用这种模式

例如应用的通知推送,如果已经有推送了,就不会一直重复再推送

 

(3)SingleTask模式:

如果我们要创建的任务不存在任务栈中,那么就会新建这个任务,并且放在栈顶

如果我们要创建的任务存在与任务栈中,就会把这个任务以上的任务全部从任务栈中移除,使它置于栈顶

使用场景——当要打开的任务所占资源比较大的时候

 

(4)SingleInstance模式:

前三种启动模式,都是在同一个任务栈中的,但SingleInstance比较特殊,它是独立一个任务栈的,在第一次打开的时候会单独创建一个栈来存放这个任务

它独占一个栈,再次点击的时候不会再创建,只是把这个任务栈直接提前到别的任务栈的前面

使用场景——在整个系统中只有唯一一个实例的情况,可以使用这种模式,例如谷歌翻译只需要打开一个,但是它可以在任何别的界面中调取,调取的时候不用重新打开新的谷歌翻译界面,而是把这个任务栈提前就好了

 

推荐阅读