体会Android的启动模式
这一篇写的是自己,对Android生命周期和启动模式的一些体会。不是对Android的生命周期和启动模式的认识,所以直接跳过了认识部分。。。
Android的生命周期
提下个别有用的知识点:
前台和后台的区别:我认为是否具有用户交互的能力
在Activity的周期中:
着重注意:onStart()和onStop(),onResume()和onPause()这两对。
从宏观看:
onStart()和onStop()作用为Activity是否可见。
onResume()和onPause()作用为Activity在前台还是后台
Android的启动模式
1.standard(默认)
谁启动了这个Activity,那么这个Activity就运行在启动它的那个Activity所在的栈中,这种模式下Activity的实例随便整。如下图:
2.singleTop
中文式瞎翻一下:栈顶为单例。
这个就是说,如果你启动的Activity已经存在,且为启动Activity所在栈的栈顶,那么你启动的Activity将不在创建实例,直接复用栈顶的Activity的实例。此时Activity不会调用自己的onCreate()与onStart()方法,因为我们复用了该Activity已经在栈顶的实例。但是它回去调用onNewIntent(Intent)为你传递启动Activity的请求信息。如果你启动的Activity已经存在,但不为启动Activity所在栈的栈顶,那么它将重写创建。
图解:
如果栈为图一情况:此时需要启动c,则不会重写创建,而是复用栈顶c.
如果栈为图二情况:如果需要创建一个c,此时栈中没有肯定会创建一个c.而需要创建一个a那???答案为图三,也会重写创建一个a.
3.singleTask
中文式瞎翻译下:Activity单任务。
这个所说的是,如果你启动的Activity已经存在,且在启动Activity所在栈中,那么系统会帮你把该Activity实例上面的所用其它activity实例退出栈,使其自己为栈顶,这样来达到创建自己的效果。
图解:
如果我们此时栈为图一,我们需要启动a,结果为图二。
当然还要再提下里面的一个重要知识点:taskAffinity(任务栈的名字)与singleTask连用开启新的任务栈
有taskAffinity 要注意
1.其值为字符串且中间必须包含分隔符.(前面为字母模式小数点)
2.默认值为应用包名。
已知 三个Activity 分别为a,b,c。a,c为standard模式,b为singleTask+taskAffinity="com.xi"模式。
a启动b,b启动c
回退是c-->b-->a 表现和正常情况一样。。。但栈情况不同,如下图。
4.singleInstance(重点)
中文式瞎翻译:单例
这个模式比较复杂,它是一种加强的singleTask的模式,除了具有singleTask模式的所有特性外,还有一点点小本事-----具有该模式的Activity只能单独的位于一个任务栈中(即 整个App中只能存在唯一的该Activity实例)
下面根据一个例子来认识下singleInstance:
已知 三个Activity 分别为a,b,c。a,c为standard模式,b为singleInstance模式。
说明:a-->b-->c表示a启动b,b启动c。
解答按下面顺序启动Activity后,按back键后退,Activity的出栈顺序???
一、a-->b-->c 则出栈顺序为c-->a-->b
解释下:
启动后栈的情况:
先退出当前栈所有activity,在退出与其有关联的栈。
二、a-->b-->c ,按home键,然后再其后台打开该应用。此时返回顺序为a-->b-->手机主页。
解释:
首先要明白:手机主页也是一个Activity,而且有其自己独有的栈。其次要知道,几个不同栈退栈时也有顺序,按其运行顺序。
看下图
对于其顺序:(图标识了栈的编号)
我们从a启动b,然后启动c,此时顺序编号为12。按下home键,为312。再打开,为132.于是退栈顺序为132,但是退到3时为手机页,相当于退出了程序,就没有2啥事了。
三、a-->c-->b 按下home键,点击该App图标打开应用。此时返回顺序为 c-->a-->手机主页。
如果根据第二种情况分析,返回顺序应该为b-->手机主页。但为啥不一样了???
解释:这里提下一个小知识点。当后台存在该App应用时,再次通过点击该App图标打开应用时,系统默认为重新打开应用,但历史栈内容不清除。
由于系统默认重新打开应用,此时回去加载App首页(即App启动第一个Activity)所在的栈1,又因为历史栈内容不清除。所以······