Activity启动模式:
1.standard 标准模式
2.singleTop
3.singleTask
4.singInstance
首先明确一个概念是任务栈
activity是存在任务栈栈这个容器里面的,栈遵循先进后出原则
TaskAffinity 是设置任务栈的属性,默认包名
standard 是最普通最常见的模式,在manifest是默认声明的,常用场景是跳页
Intent intent = new Intent("xxxx")
startActivity(intent)
singleTop (栈顶复用模式)
以singleTop启动activity时,分两种情况,第一种是任务栈的顶部activity不是该activity类型实例,则于standrar模式一样新建一个activity并入栈,假若任务栈顶部是该activity实例则通过onNewIntent接受intent传输的数据,并不会走onCreate.
主要场景:用去去掉重复点击造成的生成同样两个的activity
singleTask (栈内复用模式)
以singleTask启动activity时,分两种情况,第一种是任务栈内没有该activity的实例时,新建一个activity直接入栈,第二种是加入activity实例时发现有该类型的activity存在于任务栈内则不新建activity,复用栈内的该类型activity,并清除在这个任务栈的该activity以上的activity,与singleTop类似并不会走oncreate 而是通过onNewIntent接受数据
主要场景:用于应用内的mainactivity,不需要重复该acitivty实例
singleInstance
单一实例模式,整个手机操作系统里面只有一个实例存在。不同的应用去打开这个activity 共享公用的同一个activity。他会运行在自己单独,独立的任务栈里面,并且任务栈里面只有他一个实例存在。应用场景:呼叫来电界面。这种模式的使用情况比较罕见,在Launcher中可能使用。或者你确定你需要使Activity只有一个实例。
onNewIntent
当activity的启动模式为singleTop singleTask singleInstance,而且startActivity时候没有走onCreate时意味着任务栈已经拥有g该activity实例 则回调onNewIntent.
可以通过onNewIntent 传输intent数据
onConfigurationChanged
该方法的回调时机是activity的设备信息发生变化的时候 例如屏幕横竖的变化
但是该方法回调是需要条件的 如果没在menifest文件设置权限 以及在activity上设置configchanes对应的属性 例如screensize
orientation 则该方法不会回调,,而且 activity会在设备信息改变时销毁自身并且重新走onCreate方法