如何正确理解和使用Activity的4种启动模式
关于activity启动模式的文章已经很多,但有的文章写得过于简单,有的则过于注重细节,本文想取一个折中,只关注最重要和最常用的概念,原理和使用方法,便于读者正确应用。
activity的启动模式有4种,分别是standard.singletop. singletask. singleinstance,可以在androidmainifest.xml文件中指定每一个activity的启动模式。一个android应用一般都会有多个activity,系统会通过任务栈来管理这些activity,栈是一种后进先出的集合,当前的activity就在栈顶,按返回键,栈顶activity就会退出。activity启动模式不同,系统通过任务栈管理activity的方式也会不同,以下将分别介绍。
1 standard模式
standard模式是android的默认启动模式,你不在配置文件中做任何设置,那么这个activity就是standard模式,这种模式下,activity可以有多个实例,每次启动activity,无论任务栈中是否已经有这个activity的实例,系统都会创建一个新的activity实例,以下是实验验证。
新建一个firstactivity,用一个button去启动它本身:
发现每次都会启动一个新的fristactivity, log信息如下
什么时候用standard模式呢?standartd模式是activity的默认模式,大部分情况下,都应该使用这种模式,也就是在配置文件中什么都不用做,当确实有特殊需求时,再考虑其他模式。
2 singletop模式
singletop模式和standard模式非常相似,主要区别就是当一个singletop模式的activity已经位于任务栈的栈顶,再去启动它时,不会再创建新的实例,如果不位于栈顶,就会创建新的实例,现在把配置文件中firstactivity的启动模式改为singletop,我们的应用只有一个activity,firstactivity自然处于任务栈的栈顶。
当应用第一次启动后,我们再按button去启动新的firstactivity,发现log信息中不再打印oncreate函数,说明不再创建新的firstactivity实例。
这里有一个新的问题,对于每次启动activity,我们该如何分别处理。答案就是onnewintent()函数,虽然系统不会调用oncreat(),但会调用onnewintent,我们可以在这个函数做相应的处理。
当一个activity已经在栈顶,但依然有可能启动它,而你又不想产生新的activity实例,此时就可以用singletop模式。例如,一个搜索activity,可以输入搜索内容,也可以产生搜索结果,此时就可以用singletop模式,不会用户每次搜索都会产生一个实例。
3 singletask模式
singletask模式的activity在同一个task内只有一个实例,如果activity已经位于栈顶,系统不会创建新的activity实例,和singletop模式一样。但activity已经存在但不位于栈顶时,系统就会把该activity移到栈顶,并把它上面的activity出栈。修改上面的程序,新建一个secondactivity,将firstactivity设置为singletask启动模式,并让它启动secondactivity,再让secondactivity来启动firstactivity。
log信息如下
当secondactivity启动firstactivity时,并不会调用firstactivity的oncreate函数,但会调用onnewintent函数,同时会调用secondactivity的ondestroy函数,secondactivity实例被销毁。
singletask模式和前面两种模式的最大区别就是singletask模式是任务内单例的,所以我们是否设定activity为singletask模式,就是看我们activity是否需要单例,例如你的某个activity
里面有一个列表,如果有多个实例,有可能导致用户看到的列表不一致,有的activity需要经常启动,如果每次都创建实例,会导致占用资源过多,这些情况都可以使用singletask模式,但启动singletask模式的activity会导致任务栈内它上面的activity被销毁,有可能会影响用户体验,使用时要注意。
4 singleinstance模式
singleinstance模式也是单例的,但和singletask不同,singletask只是任务栈内单例,系统里是可以有多个singletask activity实例的,而singleinstance activity在整个系统里只有一个实例,启动一singleinstanceactivity时,系统会创建一个新的任务栈,并且这个任务栈只有他一个activity。
singleinstance模式并不常用,如果我们把一个activity设置为singleinstance模式,你会发现它启动时会慢一些,切换效果不好,影响用户体验。它往往用于多个应用之间,例如一个电视launcher里的activity,通过遥控器某个键在任何情况可以启动,这个activity就可以设置为singleinstance模式,当在某应用中按键启动这个activity,处理完后按返回键,就会回到之前启动它的应用,不影响用户体验。
以上分析了activity的4种启动模式,将activity设置为哪种启动模式并没有标准答案,有时候,你可能发现将某个activity设置为一种启动模式或者另一种启动模式,并没有明显区别,而具体的评判标准就是看哪种模式更满足应用功能,更有利于用户体验。
以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,同时也希望多多支持!
推荐阅读
-
如何正确理解和使用Activity的4种启动模式
-
详解Activity之singletast启动模式及如何使用intent传值
-
如何正确理解和使用Activity的4种启动模式
-
一、Activity的生命周期和启动模式
-
linux系统中 redis 保存数据的5种形式 linux后端模式启动 jedis无法通过IP地址和端口号访问如何修改linux防火墙
-
Android面试题-----Activity的启动模式和应用场景
-
Android从零单排关于activity的几个问题 -启动模式和Flags
-
Activity的四种启动模式和用法场景
-
安卓开发艺术探索一——Activity的生命周期和启动模式
-
Android开发艺术探索——1.Activity的生命周期和启动模式