启动模式
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了启动模式相关的知识,希望对你有一定的参考价值。
standard singleTop singleTask singleInstance
什么时候该用哪种模式? final类无法被继承,没有子类
*standard:系统默认启动模式
android是使用返回栈来管理Activity的,在standard模式下,每当启动一个新的活动,它就会在返回栈中入栈,并处于栈顶的位置。
对于使用standard模式的活动,系统不会在乎这个活动是否已经在返回栈中存在,而是每次启动活动都会创建该活动的一个新的实例。
*singleTop:
在启动Activity时,如果发现该返回栈的栈顶已经是该Activity时,则认为可以直接使用它,不会在创建新的Activity实例
singleTop适合接收通知启动的内容显示页面。
*singleTask:
每次启动该Activity时,首先会在返回栈中检查是否存在该Activity的实例,如果发现已经存在就直接使用该实例,
并把这个Activity之上的所有活动统统出栈,如果没有发现就会创建一个新的Activity实例。
singleTask适合作为程序入口点。例如浏览器的主界面。不管从多少个应用启动浏览器,只会启动主界面一次,
其余情况都会走onNewIntent,并且会清空主界面上面的其他页面。之前打开过的页面,打开之前的页面就ok,不再新建。
(如果在栈中已经有该Activity的实例,就重用该实例(会调用实例的onNewIntent())。)
onNewIntent:Activity第一启动的时候执行onCreate()---->onStart()---->onResume()等后续生命周期函数,
第一次启动Activity并不会执行到onNewIntent(). 而后面如果再有想启动Activity的时候,
那就是执行onNewIntent()---->onResart()------>onStart()----->onResume().
如果android系统由于内存不足把已存在Activity释放掉了,那么再次调用的时候会重新启动Activity即执行onCreate()---->onStart()---->onResume()等。
当调用到onNewIntent(intent)的时候,需要在onNewIntent() 中使用setIntent(intent)赋值给Activity的Intent.否则,后续的getIntent()都是得到老的Intent。
launchMode为singleTask的时候,通过Intent启到一个Activity,如果系统已经存在一个实例,系统就会将请求发送到这个实例上,
但这个时候,系统就不会再调用通常情况下我们处理请求数据的onCreate方法,而是调用onNewIntent方法
系统可能会随时杀掉后台运行的Activity,如果这一切发生,那么系统就会调用onCreate方法,而不调用onNewIntent方法,
一个好的解决方法就是在onCreate和onNewIntent方法中调用同一个处理数据的方法
*singleInstance:
指定为singleInstance模式的Activity会启用一个新的返回栈来管理这个Activity,
不管是哪个应用程序来访问这个Activity,都共用同一个返回栈,解决了共享Activity实例的问题
singleInstance适合需要与程序分离开的页面。
线程池: executorService
ThreadPoolExecutor
可缓存线程池CachedThreadPool
定长线程池FixedThreadPool
SingleThreadPool mFixedThreadPool = Executors.newSingleThreadPool();
ScheduledThreadPool
以上是关于启动模式的主要内容,如果未能解决你的问题,请参考以下文章
Kotlin 协程协程启动 ④ ( 协程启动模式 | 协程构建器启动模式参数 | DEFAULT 模式 | ATOMIC 模式 | LAZY 模式 | UNDISPATCHED 模式 )