明天就是端午节了,先在这里预祝大家端午节快乐!
记得以前的这个时候,一般都是请几天假,凑够一周,出去浪一圈再回来,哈哈,今年,因为一些个人原因吧,这次没有去远方,想安安静静的沉淀下自己,整理下思路,该何去何从。
接着上一章的 《Android开发艺术探索》第一章笔记(一) Activity超详细的生命周期理解 后,下面来复习下Activity的启动模式。话说,我也是经常用到其中的两种,嘻嘻...。
两个要点:
- Activitry的LaunchMode
- Activity的Flags
一 Activitry的LaunchMode
一个应用程序通常被拆分为多个Activity,在默认情况下,当我们多次启动同一个activity时,系统会创建多个实例并把它们放入任务栈中,任务栈是一种“ 后进先出 ”的栈结构。除了默认的情况,还有其他的情况。目前有四种启动模式:
- standard(默认)
- singleTop
- singleTask
- singleInstance
(1) standard(默认) :标准模式,一调用startActivity()方法就会产生一个新的实例,不管这个实例是否已经存在。
(2) singleTop :栈顶复用模式,如果某个Activity的Launch mode设置成singleTop,那么当该Activity位于栈顶的时候,再通过Intent跳转到本身这个Activity,则将不会创建一个新的实例压入栈中。如果新Activity的实例已经存在但不是位于栈顶,那么新Activity仍然会重新重建。
例如:现在栈的情况为:A B C D。D的Launch mode设置成了singleTop,那么在D中启动Intent跳转到D,那么将不会新创建一个D的实例压入栈中,此时栈的情况依然为:A B C D。但是如果此时B的模式也是singleTop,D跳转到B,那么则会新建一个B的实例压入栈中,因为此时B不是位于栈顶,此时栈的情况就变成了:A B C D B。
(3)singleTask :栈内复用模式。这是一种单例模式,如果某个Activity是singleTask模式,那么Task栈中将会只有一个该Activity的实例。
例如:现在栈的情况为:A B C D。B的Launch mode为singleTask,此时D通过Intent跳转到B,则栈的情况变成了:A B。而C和D被弹出销毁了,也就是说位于B之上的实例都被销毁了。
(4)singleInstance :单实例模式,这是一种加强的singleTask模式,它除了具有singleTask模式的所有特性之外,还加强了一点,那就是此种模式的Activity只能单独地位于一个任务栈中。
例如:Task栈1的情况为:A B C。C通过Intent跳转到D,而D的Launch mode为singleInstance,则将会新建一个Task栈2。此时Task栈1的情况还是为:A B C。Task栈2的情况为:D。此时屏幕界面显示D的内容,
如果这时D又通过Intent跳转到D,则Task栈2中也不会新建一个D的实例,所以两个栈的情况也不会变化。而如果D跳转到C,则栈1的情况变成了:A B C C,因为C的Launch mode为standard,此时如果再按返回键,则栈1变成:A B C。也就是说现在界面还显示C的内容,不是D。
好了,现在有一个问题就是这时这种情况下如果用户点击了Home键,则再也回不到D的即时界面了。如果想解决这个问题,可以为D在Manifest.xml文件中的声明加上
<intent-filter>
<action android:name="android.intent.action.MAIN" />
<category android:name="android.intent.category.LAUNCHER" />
</intent-filter>
加上这段之后,也就是说该程序中有两个这种声明,另一个就是那个正常的根 activity,在打成apk包安装之后,在程序列表中能看到两个图标,但是如果都运行的话,在任务管理器中其实也只有一个。上面的情况点击D的那个图标就能回到它的即时界面(比如一个EditText,以前输入的内容,现在回到之后依然存在)。
二 Activity的Flags
Activity的Flags有很多,这里看一些常用的标记位。
FLAG_ACTIVITY_NEW_TASK
其效果和在XML中指定启动“singleTask”模式相同
FLAG_ACTIVITY_SINGLE_TOP
如果设置,当这个Activity位于历史stack的顶端运行时,不再启动一个新的。
FLAG_ACTIVITY_CLEAR_TOP
如果设置,并且这个Activity已经在当前的Task中运行,因此,不再是重新启动一个这个Activity的实例,而是在这个Activity上方的所有Activity都将关闭,然后这个Intent会作为一个新的Intent投递到老的Activity(现在位于顶端)中。
-------- 例如,假设一个Task中包含这些Activity:A,B,C,D。如果D调用了startActivity(),并且包含一个指向Activity B的Intent,那么,C和D都将结束,然后B接收到这个Intent,因此,目前stack的状况是:A,B。
FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS
如果设置,新的Activity不会在最近启动的Activity的列表中保存。
FLAG_ACTIVITY_LAUNCHED_FROM_HISTORY
这个标志一般不由应用程序代码设置,如果这个Activity是从历史记录里启动的(常按HOME键),那么,系统会帮你设定。
FLAG_ACTIVITY_NO_HISTORY
使用这个模式启动Activity,当该Activity启动其他Activity后,该Activity消失了,不会保留在栈Activity中。
还有一些,可以去参考官方文档,我们不必去死记硬背,理解即可~
晚安,好梦~